term% ls -F
term% cat index.txt
FORK(2)                       System Calls Manual                      FORK(2)

       fork, rfork - manipulate process resources

       #include <u.h>
       #include <libc.h>

       int fork(void)

       int rfork(int flags)

       Forking  is the only way new processes are created.  The flags argument
       to rfork selects which resources of the invoking process  (parent)  are
       shared  by the new process (child) or initialized to their default val‐
       ues.  The resources include the file name space, the open file descrip‐
       tor  table  (which,  when  shared,  permits processes to open and close
       files for other processes),  the  set  of  environment  variables  (see
       env(3)),  the note group (the set of processes that receive notes writ‐
       ten to a member's notepg file; see proc(3)), and open files.  Flags  is
       the logical OR of some subset of

       RFPROC If  set  a  new process is created; otherwise changes affect the
              current process.

              If set, the child process will be dissociated from  the  parent.
              Upon  exit the child will leave no Waitmsg (see wait(2)) for the
              parent to collect.

              If set, the new process inherits a copy  of  the  parent's  name
              space; otherwise the new process shares the parent's name space.
              The tag space for rendezvous(2) is considered part of  the  name
              space.  Is mutually exclusive with 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  descrip‐
              tor.  Is mutually exclusive with RFNAMEG.

       RFENVG If  set, the environment variables are copied; otherwise the two
              processes share environment variables.   Is  mutually  exclusive
              with RFCENVG.

              If  set,  the  new process starts with an empty environment.  Is
              mutually exclusive with RFENVG.

              Each process is a member of a group of processes  that  all  re‐
              ceive  notes when a note is written to any of their notepg files
              (see proc(3)).  The group of a new process  is  by  default  the
              same  as  its  parent,  but if RFNOTEG is set (regardless of RF‐
              PROC), the process becomes the first in a  new  group,  isolated
              from previous processes.

       RFFDG  If  set,  the  invoker's file descriptor table (see intro(2)) is
              copied; otherwise the two processes share a single table.

       RFCFDG If set, the new process starts with a clean file descriptor  ta‐
              ble.  Is mutually exclusive with RFFDG.

       RFMEM  If  set,  the  kernel will mark segments of type data and bss as
              shared. The child will then inherit all the shared segments  the
              parent  process  owns.  Other  segment types will be unaffected.
              Subsequent forks by the parent will then  propagate  the  shared
              data  and  bss  between  children.   The stack segment is always
              split.  May be set only with RFPROC.

       File descriptors in a shared file descriptor table are kept open  until
       either  they  are  explicitly closed or all processes sharing the table

       If 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 RFPROC, the return value is  zero.   Process  ids  range
       from 1 to the maximum integer (int) value.  Rfork will sleep, if neces‐
       sary, until required process resources are available.

       Fork is just a call of rfork(RFFDG|RFPROC).


       intro(2), proc(3),

       These functions set errstr.