NAME
fork1 —
create a new process
SYNOPSIS
#include <sys/types.h>
#include <sys/proc.h>
int
fork1(
struct lwp
*l1,
int flags,
int exitsig,
void *stack,
size_t stacksize,
void (*func)(void *),
void *arg,
register_t *retval,
struct proc **rnewprocp);
DESCRIPTION
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 implement 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 address space.
-
-
- FORK_SHARECWD
- The child process will share the parent's current
directory, root directory, and file creation mask.
-
-
- FORK_SHAREFILES
- The child process will share the parent's file
descriptors.
-
-
- FORK_SHARESIGS
- The child process will share the parent's signal
actions.
-
-
- 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 be called when the child process returns
instead of
child_return(). These are used for example in
starting the init process and creating kernel threads.
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[0]
- This will contain the pid of the child process.
-
-
- retval[1]
- 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[1] and bitwise-AND it with
retval[0], 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.
RETURN VALUES
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
exceeded.
-
-
- [
EAGAIN
]
- The limit
RLIMIT_NPROC
on the total
number of processes under execution by this user id would be
exceeded.
SEE ALSO
execve(2),
fork(2),
vfork(2)