[plt-scheme] custodian + process/ports

From: Tom Schouten (tom at zwizwa.be)
Date: Tue Jul 1 15:26:12 EDT 2008


> I would create my own input port using 'make-input-port, which might  
> work just as a pipe, but with 'close to close the custodian that control  
> the gnuplot process.
>
> Hope that helps.
>

Thanks for the tip. I seem to get it to work for 'close-output-port, but 
creating a port in the scope of a custodian and then using 
'custodian-shutdown-all doesn't seem to shut it down properly.

(require
 scheme/system
 scheme/match)

(define (open-gnuplot)
  (let ((co (current-output-port)))
    (match
     (process/ports co #f co "gnuplot")
     ((list stdout
            stdin
            pid
            stderr
            control)
      (make-output-port
       'gnuplot
       stdin
       (lambda (bytes start endx _ __)
         (write-bytes bytes stdin start endx))
       (lambda ()
         (printf "closing gnuplot\n")
         (close-output-port stdin)
         (control 'wait)))))))




> (close-output-port (open-gnuplot))
closing gnuplot


> (define p #f)
> (define c (make-custodian))
> (parameterize ((current-custodian c))
>    (set! p (open-gnuplot)))
> (custodian-shutdown-all c)

-> closes only the embedded port (gnuplot process is defunct)


Posted on the users mailing list.