lab/output-process.ss
#lang scheme/base

(require scheme/system)
(provide open-output-process)

;; Together with spawn.c this gets rid of zombie processes. Child
;; processes get killed whenever their stdin is closed.

(define (open-output-process . cmdline)
  (define out (open-output-file "/tmp/output-process.log" #:exists 'append))
  (let-values
      (((proc
         stdout
         stdin
         stderr) (apply subprocess
                        out #f out
                        "/usr/local/bin/spawn"
                        cmdline)))
    (subprocess-wait proc)
    ;;;; Can't detect exec errors!
    ;; (unless (= 0 (subprocess-status proc))
    ;;  (error 'dfork-error))
    stdin))

;; It doesn't look like it's so straightforward to do this with the
;; FFI. Also, there will be code duplication from
;; plt/src/mzscheme/src/port.c which performs some action after fork
;; and before exec.