NAME
fork1
—
create a new process
SYNOPSIS
#include
<sys/types.h>
#include <sys/proc.h>
int
fork1
(struct proc *p1,
int flags, void (*func)(void *),
void *arg, register_t *retval,
struct proc **rnewprocp);
DESCRIPTION
fork1
()
creates a new process out of p1, which should be the
current thread. This function is used primarily to implement the
fork(2) and
vfork(2) system calls, as
well as the kthread_create(9) function.
The flags argument is used to control the behavior of the fork and is created by a bitwise-OR of the following values:
FORK_FORK
- The call is done by the fork(2) system call. Used only for statistics.
FORK_VFORK
- The call is done by the vfork(2) system call. Used only for statistics.
FORK_PPWAIT
- Suspend the parent process until the child is terminated (by calling _exit(2) or abnormally), or makes a call to execve(2).
FORK_SHAREFILES
- Let the child share the file descriptor table with the parent through
fdshare
(). The default behavior is to copy the table throughfdcopy
(). FORK_IDLE
- The new thread will be left in the
SIDL
state. The default behavior is to make it runnable and add it to the run queue. FORK_NOZOMBIE
- The child will be dissociated from the parent and will not leave a status for the parent to collect. See wait(2).
FORK_SHAREVM
- The child will share the parent's address space. The default behavior is that the child gets a copy-on-write copy of the address space.
FORK_SYSTEM
- The child will be marked as a system process.
FORK_PTRACE
- The child will start with tracing enabled, as if ptrace(PT_TRACE_ME, 0, 0, 0) had been invoked in the child.
The new thread will begin execution by calling
func, which must not be NULL
.
If arg is not NULL
, it is
passed as the argument to func. Otherwise, a pointer
to the new process's only thread is passed.
If retval is not
NULL
, the PID of the child process will be stored in
*retval on successful completion.
If rnewprocp is not
NULL
, the newly created thread is stored in
*rnewprocp on successful completion.
RETURN VALUES
Upon successful completion of the fork operation,
fork1
() returns 0. Otherwise, the following error
values are returned:
- [
EAGAIN
] - The system limits on the total number of threads or processes would be exceeded.
- [
EAGAIN
] - The limit
RLIMIT_NPROC
on the total number of processes under execution by this user id would be exceeded. - [
ENOMEM
] - There is insufficient swap space for the new thread.
SEE ALSO
execve(2), fork(2), vfork(2), kthread_create(9), psignal(9), tfind(9)
CAVEATS
The fork1
function semantics are specific
to OpenBSD. Other BSD
systems have different semantics.