Next: posix process fork binary, Previous: posix process fork fork, Up: posix process fork [Index]
Wrapper for fork that sets up the file descriptor pipes to
communicate with the child process, fork.
When successful: return the same return value of fork; otherwise
raise the same exception of fork.
The procedure parent-proc is called as follows:
(parent-proc child-pid
parent->child-stdin
parent<-child-stdout
parent<-child-stderr)
where the arguments are the following objects:
child-pidIt is a fixnum representing the pid of the child process.
parent->child-stdinIt is a file descriptor writing into the standard input of the child process.
parent<-child-stdoutIt is a file descriptor reading from the standard output of the child process.
parent<-child-stderrIt is a file descriptor reading from the standard error of the child process.
The thunk child-thunk is called with no arguments. The child can
use the standard file descriptors 0, 1, 2 which are
made distinct from the parent’s standard file descriptors.
To be called in the child process, after a fork operation, to replace
the standard file descriptors 0, 1, 2 with the file
descriptors child-stdin, child-stdout, child-stderr.
When successful: return unspecified values; otherwise raise an
exception.
Perform the following operations:
0, 1, 2.
0, 1, 2.
Notice that:
0, 1, 2 after this call will wrap the
new file descriptors 0, 1, 2.
standard-output-port, standard-error-port,
console-output-port, console-error-port.
Here is an example that forks a process, sets up the file descriptors in the child process, waits for child to terminate.
(import (vicare)
(prefix (vicare posix) px.))
(let-values
(((child-stdin parent->child-stdin) (px.pipe))
((parent<-child-stdout child-stdout) (px.pipe))
((parent<-child-stderr child-stderr) (px.pipe)))
(define (parent-proc child-pid)
(px.close child-stdin)
(px.close child-stdout)
(px.close child-stderr)
(unwind-protect
(let ((bufout (make-bytevector 4 0))
(buferr (make-bytevector 4 0)))
(px.write parent->child-stdin '#ve(ascii "ciao\n"))
(let ((status (px.waitpid child-pid 0)))
(if (and (px.WIFEXITED status)
(zero? (px.WEXITSTATUS status)))
(begin
(px.read parent<-child-stdout bufout)
(px.read parent<-child-stderr buferr)
(values bufout buferr))
(error #f
"child process exited abnormally"
status))))
(px.close parent->child-stdin)
(px.close parent<-child-stdout)
(px.close parent<-child-stderr)))
(define (child-thunk)
(guard (E (else
(print-condition E)
(exit 1)))
(px.close parent->child-stdin)
(px.close parent<-child-stdout)
(px.close parent<-child-stderr)
(px.after-fork/prepare-child-file-descriptors
child-stdin child-stdout child-stderr)
(let ((buf (make-bytevector 5 0)))
(px.read 0 buf)
(assert (bytevector=? buf '#ve(ascii "ciao\n")))
(px.write 1 '#ve(ascii "out\n"))
(px.write 2 '#ve(ascii "err\n"))
(exit 0))))
(flush-output-port (console-output-port))
(flush-output-port (console-error-port))
(px.fork parent-proc child-thunk))
here is the same example using fork-with-fds:
(import (vicare)
(prefix (vicare posix) px.))
(define (parent-proc child-pid
parent->child-stdin
parent<-child-stdout
parent<-child-stderr)
(unwind-protect
(let ((bufout (make-bytevector 4 0))
(buferr (make-bytevector 4 0)))
(px.write parent->child-stdin '#ve(ascii "ciao\n"))
(let ((status (px.waitpid child-pid 0)))
(if (and (px.WIFEXITED status)
(zero? (px.WEXITSTATUS status)))
(begin
(px.read parent<-child-stdout bufout)
(px.read parent<-child-stderr buferr)
(values bufout buferr))
(error #f
"child process exited abnormally"
status))))
(px.close parent->child-stdin)
(px.close parent<-child-stdout)
(px.close parent<-child-stderr)))
(define (child-thunk)
(guard (E (else
(print-condition E)
(exit 1)))
(let ((buf (make-bytevector 5 0)))
(px.read 0 buf)
(assert (bytevector=? buf '#ve(ascii "ciao\n")))
(px.write 1 '#ve(ascii "out\n"))
(px.write 2 '#ve(ascii "err\n"))
(exit 0))))
(px.fork-with-fds parent-proc child-thunk)
Next: posix process fork binary, Previous: posix process fork fork, Up: posix process fork [Index]