|  | .TH RFORK 3 | 
|  | .SH NAME | 
|  | rfork \- manipulate process state | 
|  | .SH SYNOPSIS | 
|  | .B #include <u.h> | 
|  | .br | 
|  | .B #include <libc.h> | 
|  | .PP | 
|  | .nf | 
|  | .B | 
|  | int rfork(int flags) | 
|  | .fi | 
|  | .SH DESCRIPTION | 
|  | .I Rfork | 
|  | is a partial implementation of the Plan 9 system call. | 
|  | It can be used to manipulate some process state and to create | 
|  | new processes a la | 
|  | .IR fork (2). | 
|  | It cannot be used to create shared-memory processes | 
|  | (Plan 9's | 
|  | .B RFMEM | 
|  | flag); for that functionality use | 
|  | .I proccreate | 
|  | (see | 
|  | .IR thread (3)). | 
|  | .PP | 
|  | The | 
|  | .I flags | 
|  | argument to | 
|  | .I rfork | 
|  | selects which resources of the | 
|  | invoking process (parent) are shared | 
|  | by the new process (child) or initialized to | 
|  | their default values. | 
|  | .I Flags | 
|  | is the logical OR of some subset of | 
|  | .TF RFCNAMEG | 
|  | .TP | 
|  | .B RFPROC | 
|  | If set a new process is created; otherwise changes affect the | 
|  | current process. | 
|  | .TP | 
|  | .B RFNOWAIT | 
|  | If set, the child process will be dissociated from the parent. Upon | 
|  | exit the child will leave no | 
|  | .B Waitmsg | 
|  | (see | 
|  | .IR wait (3)) | 
|  | for the parent to collect. | 
|  | .\" .TP | 
|  | .\" .B RFNAMEG | 
|  | .\" If set, the new process inherits a copy of the parent's name space; | 
|  | .\" otherwise the new process shares the parent's name space. | 
|  | .\" Is mutually exclusive with | 
|  | .\" .BR RFCNAMEG . | 
|  | .\" .TP | 
|  | .\" .B RFCNAMEG | 
|  | .\" If set, the new process starts with a clean name space. A new | 
|  | .\" name space must be built from a mount of an open file descriptor. | 
|  | .\" Is mutually exclusive with | 
|  | .\" .BR RFNAMEG . | 
|  | .\" .TP | 
|  | .\" .B RFNOMNT | 
|  | .\" If set, subsequent mounts into the new name space and dereferencing | 
|  | .\" of pathnames starting with | 
|  | .\" .B # | 
|  | .\" are disallowed. | 
|  | .\" .TP | 
|  | .\" .B RFENVG | 
|  | .\" If set, the environment variables are copied; | 
|  | .\" otherwise the two processes share environment variables. | 
|  | .\" Is mutually exclusive with | 
|  | .\" .BR RFCENVG . | 
|  | .\" .TP | 
|  | .\" .B RFCENVG | 
|  | .\" If set, the new process starts with an empty environment. | 
|  | .\" Is mutually exclusive with | 
|  | .\" .BR RFENVG . | 
|  | .TP | 
|  | .B RFNOTEG | 
|  | Each process is a member of a group of processes that all | 
|  | receive notes when a note is sent to the group | 
|  | (see | 
|  | .IR postnote (3) | 
|  | and | 
|  | .IR signal (2)). | 
|  | The group of a new process is by default the same as its parent, but if | 
|  | .B RFNOTEG | 
|  | is set (regardless of | 
|  | .BR RFPROC ), | 
|  | the process becomes the first in a new group, isolated from | 
|  | previous processes. | 
|  | In Plan 9, a process can call | 
|  | .B rfork(RFNOTEG) | 
|  | and then be sure that it will no longer receive console interrupts | 
|  | or other notes. | 
|  | Unix job-control shells put each command in its own process group | 
|  | and then relay notes to the current foreground command, making | 
|  | the idiom less useful. | 
|  | .TP | 
|  | .B RFFDG | 
|  | If set, the invoker's file descriptor table (see | 
|  | .IR intro ( )) | 
|  | is copied; otherwise the two processes share a | 
|  | single table. | 
|  | .\" .TP | 
|  | .\" .B RFCFDG | 
|  | .\" If set, the new process starts with a clean file descriptor table. | 
|  | .\" Is mutually exclusive with | 
|  | .\" .BR RFFDG . | 
|  | .\" .TP | 
|  | .\" .B RFREND | 
|  | .\" If set, the process will be unable to | 
|  | .\" .IR rendezvous (3) | 
|  | .\" with any of its ancestors; its children will, however, be able to | 
|  | .\" .B rendezvous | 
|  | .\" with it.  In effect, | 
|  | .\" .B RFREND | 
|  | .\" makes the process the first in a group of processes that share a space for | 
|  | .\" .B rendezvous | 
|  | .\" tags. | 
|  | .\" .TP | 
|  | .\" .B RFMEM | 
|  | .\" If set, the child and the parent will share | 
|  | .\" .B data | 
|  | .\" and | 
|  | .\" .B bss | 
|  | .\" segments. | 
|  | .\" Otherwise, the child inherits a copy of those segments. | 
|  | .\" Other segment types, in particular stack segments, will be unaffected. | 
|  | .\" May be set only with | 
|  | .\" .BR RFPROC . | 
|  | .PD | 
|  | .PP | 
|  | File descriptors in a shared file descriptor table are kept | 
|  | open until either they are explicitly closed | 
|  | or all processes sharing the table exit. | 
|  | .PP | 
|  | If | 
|  | .B RFPROC | 
|  | is set, the | 
|  | value returned in the parent process | 
|  | is the process id | 
|  | of the child process; the value returned in the child is zero. | 
|  | Without | 
|  | .BR RFPROC , | 
|  | the return value is zero. | 
|  | Process ids range from 1 to the maximum integer | 
|  | .RB ( int ) | 
|  | value. | 
|  | .I Rfork | 
|  | will sleep, if necessary, until required process resources are available. | 
|  | .PP | 
|  | Calling | 
|  | .B rfork(RFFDG|RFPROC) | 
|  | is equivalent to calling | 
|  | .IR fork (2). | 
|  | .SH SOURCE | 
|  | .B \*9/src/lib9/rfork.c | 
|  | .SH DIAGNOSTICS | 
|  | .I Rfork | 
|  | sets | 
|  | .IR errstr . |