[plt-scheme] subprocess and wait
On 26/02/06, Eli Barzilay <eli at barzilay.org> wrote:
> On Feb 26, Paulo J. Matos wrote:
> > On 26/02/06, Eli Barzilay <eli at barzilay.org> wrote:
> > >
> > > A side-comment: running a subprocess that generates lots of
> > > outputs and collecting all that text in the scheme process might
> > > not be a good idea since you're making that other process compete
> > > with scheme for memory. My guess is that switching things so you
> > > process the subprocess output in a thread is going to be just a
> > > little bit more complex.
> >
> > I guess you're right, but what would then be your suggestion? Doing
> > the parsing of the output of the process during its execution?
>
> Yes. Something like this:
>
> (require (lib "port.ss"))
> (define (with-input-from-subprocess exe thunk)
> (define-values (in out) (make-pipe))
> (define-values (p pout pin perr)
> (subprocess #f (open-input-file "/dev/null") (current-error-port) exe))
> (thread (lambda ()
> (copy-port pout out)
> (close-output-port out)
> (subprocess-wait p)))
> (parameterize ([current-input-port in]) (thunk)))
>
> (require (lib "string.ss"))
> (printf ">> ~s\n"
> (with-input-from-subprocess "/bin/pwd"
> (lambda () (regexp-split #rx"/" (read-line)))))
>
Yes, didn't know about copy-port, thanks. Still, it's not working as I
expected, since thunk is reading data and returning when eof-object?
is returned by (read-line). But this happens when no data is there,
but the process might still be running. So probably I only stop
parsing the output when the process stops and not when eof-object? is
found, right? Or is there a better way.
On a more technical side of the code. Is there any special reason why
you used define-values and not let-values? Wouldn't it be considered
'more correct' (whatever that means) to use let-values?
Cheers,
Paulo Matos
>
> --
> ((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
> http://www.barzilay.org/ Maze is Life!
>
--
Paulo Jorge Matos - pocm at sat inesc-id pt
Web: http://sat.inesc-id.pt/~pocm
Computer and Software Engineering
INESC-ID - SAT Group