[gambit-list] stop external filters

Thomas Hafner hafner at sdf-eu.org
Thu Jun 2 08:05:03 EDT 2005


Hello,

I'm experimenting about using external commands, which act as filters
(i.e. read from standard input and write to standard output):

  (define p (open-process (list path: "/bin/head")))
  
  (define t
    (make-thread
     (lambda ()
       (let loop ()
         (define line (read-line p))
         (if (eof-object? line)
             line
             (begin
               (display "[")
               (display line)
               (display "]\n")
               (thread-yield!)
               (loop)))))))
  
  (thread-start! t)
  
  (display "a\nb\nc\n" p)
  (display "d\ne\nf\ng\nh\ni\nj\nk\nl\n" p)
  (force-output p)
  (thread-join! t)

Here's the corresponding output:

  [a]
  [b]
  [c]
  [d]
  [e]
  [f]
  [g]
  [h]
  [i]
  [j]

No problem so far. This case is easy, because the external command
/bin/head terminates automatically after having filtered the first 10
lines.

But there are filters, which will never terminate automatically, e.g.
/bin/cat. In that case I want the main thread stopping filtering.

How can that be done? By adding (close-port p) somewhere? How should
the example look like, if /bin/head is replaced by /bin/cat, and the
sending thread decides to terminate after having sent 10 lines. The
output should be the same as from the original example, of course.

Regards
  Thomas



More information about the Gambit-list mailing list