(import (chicken base) (chicken process) (chicken process-context) (chicken process-context posix) (chicken foreign) (chicken file posix) ) (foreign-declare " #include #include ") (define make-socketpair (foreign-primitive () " int ends[2] = { -1, -1 }; socketpair(PF_LOCAL, SOCK_STREAM, 0, ends); C_word av[4] = { C_SCHEME_UNDEFINED, C_k, C_fix(ends[0]), C_fix(ends[1]) }; C_values(4, av); ")) (define (write/flush data port) (write data port) (flush-output port)) (define (debug . args) (apply print (current-process-id) ": " args)) (let-values (((p c) (make-socketpair))) (define datum (if (string=? (car (command-line-arguments)) "ok") '() #t)) (print "datum is " datum) (define (child) (let ((out (open-output-file* c)) (in (open-input-file* c))) (debug "sleeping") (sleep 1) (debug "writing to parent") (write/flush datum out) (debug "bye"))) (define (parent child) (let ((out (open-output-file* p)) (in (open-input-file* p))) (debug "reading from " child) (let ((got (read in))) (debug "got '" got "' - bye")))) (let ((pid (process-fork child #t))) (if (zero? pid) (exit) (parent pid))))