FORK1(9) BSD Kernel Developer's Manual FORK1(9)
fork1 -- create a new process
fork1(struct lwp *l1, int flags, int exitsig, void *stack,
size_t stacksize, void (*func)(void *), void *arg,
register_t *retval, struct proc **rnewprocp);
fork1() creates a new process out of the process behind l1, which is
assumed to be the current lwp. This function is used primarily to imple-
ment the fork(2) and vfork(2) system calls, but is versatile enough to be
used as a backend for e.g. the __clone(2) call.
The flags argument controls the semantics of the fork operation, and is
made up of the bitwise-OR of the following values:
FORK_PPWAIT The parent process will sleep until the child process
successfully calls execve(2) or exits (either by a call
to _exit(2) or abnormally).
FORK_SHAREVM The child process will share the parent's virtual
address space. If this flag is not specified, the child
will get a copy-on-write snapshot of the parent's
FORK_SHARECWD The child process will share the parent's current direc-
tory, root directory, and file creation mask.
FORK_SHAREFILES The child process will share the parent's file descrip-
FORK_SHARESIGS The child process will share the parent's signal
FORK_NOWAIT The child process will at creation time be inherited by
the init process.
FORK_CLEANFILES The child process will not copy or share the parent's
descriptors, but rather will start out with a clean set.
A flags value of 0 indicates a standard fork operation.
The exitsig argument controls the signal sent to the parent on child
death. If normal operation desired, SIGCHLD should be supplied.
It is possible to specify the child userspace stack location and size by
using the stack and stacksize arguments, respectively. Values NULL and
0, respectively, will give the child the default values for the machine
architecture in question.
The arguments func and arg can be used to specify a kernel function to
called for child return handling instead of child_return(). These are
used for example in starting the init process and creating kernel
The retval argument is provided for the use of system call stubs. If
retval is not NULL, it will hold the following values after successful
completion of the fork operation:
retval This will contain the pid of the child process.
retval In the parent process, this will contain the value 0. In the
child process, this will contain 1.
User level system call stubs typically subtract 1 from retval and bit-
wise-AND it with retval, thus returning the pid to the parent process
and 0 to the child.
If rnewprocp is not NULL, *rnewprocp will point to the newly created
process upon successful completion of the fork operation.
Upon successful completion of the fork operation, fork1() returns 0.
Otherwise, the following error values are returned:
[EAGAIN] The limit on the total number of system processes would be
[EAGAIN] The limit RLIMIT_NPROC on the total number of processes under
execution by this user id would be exceeded.
execve(2), fork(2), vfork(2)
BSD March 11, 2004 BSD