| .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 . |