[plt-scheme] custodian + process/ports
On Jul 1, Tom Schouten wrote:
> On Tue, Jul 01, 2008 at 01:43:54PM -0600, Chongkai Zhu wrote:
> > As the doc says, 'process/ports executes a shell command asynchronously,
> > which means is is not under the control of custodian. It seems that you
> > need to use 'subprocess instead of 'process/ports to get subprocess
> > value, and then use 'subprocess-kill to kill it.
>
> 'subprocess also executes asynchronously, which i thought to mean
> "doesn't wait until process termination to return".
>
> Using process/ports the custodian does seem to close the ports, it
> just doesn't collect the return value of the process producing a
> zombie. Your suggested method works, but what i don't understand is
> why the 'close method of the port created by 'make-output-port
> doesn't get called by 'custodian-shutdown-all.
My guess would be that the subprocess object gets released, but the
process is still alive, which leads to the zombie. (The main problem
being that custodians manage memory & ports, but not processes.)
> Then another question: what is the difference between the process
> and subprocess procedures? (maybe the question is really: What's the
> difference between ordinary ports and file ports wrt. custodians?)
* `subprocess' is the builtin functionality, `process' is in a scheme
library.
* `subprocess' returns multiple values, `process' returns a list (it's
an interface that was taken from scsh, I think)
* `subprocess' requires "stream" ports for stdin/out/err, or #f that
returns a pipe that you need to feed or consume; `process' abstracts
all that for you and simply uses the current scheme ports (making up
the pipes and feeding threads when needed)
* `subprocess' is the only function that does what it does; `process'
has several relatives (like `process' itself that takes a command
line, `process*' that takes the executable and args, `system' that
just runs the command synchronously, etc).
--
((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
http://www.barzilay.org/ Maze is Life!