15 if((flags&(RFPROC|RFFDG|RFMEM)) == (RFPROC|RFFDG)){
16 /* check other flags before we commit */
17 flags &= ~(RFPROC|RFFDG);
18 n = (flags & ~(RFNOTEG|RFNAMEG|RFNOWAIT));
20 werrstr("unknown flags %08ux in rfork", n);
34 * Parent - wait for child to fork wait-free child.
35 * Then read pid from pipe. Assume pipe buffer can absorb the write.
38 wait4(pid, &status, 0, 0);
39 n = readn(p[0], buf, sizeof buf-1);
41 if(!WIFEXITED(status) || WEXITSTATUS(status)!=0 || n <= 0){
42 werrstr("pipe dance failed in rfork");
46 n = strtol(buf, &q, 0);
54 * Child - fork a new child whose wait message can't
55 * get back to the parent because we're going to exit!
57 signal(SIGCHLD, SIG_IGN);
61 /* Child parent - send status over pipe and exit. */
63 fprint(p[1], "%d", pid);
69 /* Child child - close pipe. */
78 werrstr("cannot use rfork for shared memory -- use ffork");
82 /* XXX set $NAMESPACE to a new directory */
90 werrstr("cannot use RFNOWAIT without RFPROC");
94 werrstr("unknown flags %08ux in rfork", flags);