guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: getting pipes going


From: Daniel Hartwig
Subject: Re: getting pipes going
Date: Fri, 15 Jun 2012 15:23:13 +0800

On 15 June 2012 01:10, Johan Hidding <address@hidden> wrote:
> (use-modules (ice-9 popen))
>
> (display (with-output-to-string (lambda ()
>           (let ((P (open-pipe "cat" OPEN_WRITE)))
>             (display "Hello World!\n" P)
>             (close-pipe P)))))
>
> to output: Hello World!
> But it gives me nothing, using guile-2.0.5. What's going wrong? I
> would love to see some examples on how pipes are "supposed to be"
> used.
> Cheers, Johan
>

Hello

There is some difficulty using pipes in this way.  If you want to
capture the output to a string use an input-output pipe.  The trick is
to use force-output after writing to the port so that the program has
definitely received the input:

(use-modules (ice-9 popen))
(use-modules (ice-9 rdelim))
(let ((p (open-pipe "cat" OPEN_BOTH)))
  (display "Hello\n" p)
  (force-output p)
  (read-line p))
=> "Hello"

For some programs (such as sed, gzip) they buffer their input and
often wait until EOF.  In this case you must write all the data and
then close the port before you can read anything back.  The open-pipe
procedures are not good at this, because you can not close just one
side of the port object they return.

Instead, use run-with-pipe (from guile-lib's (os process) module).
The basic pattern is like this:

(use-modules (os process))
(let ((p (cdr (run-with-pipe "r+" "cat"))))
  (display "Hello\n" (cdr p))
  (force-output (cdr p))
  (close-port (cdr p)) ;; important if "cat" waits for EOF
  (read-line (car p))
  (close-port (car p)))
=> "Hello"

Note that p is a pair of pipes.  The procedure run-with-pipe also
returns the process id, but the above code discards it.

Regards



reply via email to

[Prev in Thread] Current Thread [Next in Thread]