The fork
function is the primitive for creating a process.
It is declared in the header file unistd.h.
The
fork
function creates a new process.If the operation is successful, there are then both parent and child processes and both see
fork
return, but with different values: it returns a value of0
in the child process and returns the child's process ID in the parent process.If process creation failed,
fork
returns a value of-1
in the parent process. The followingerrno
error conditions are defined forfork
:
EAGAIN
- There aren't enough system resources to create another process, or the user already has too many processes running. This means exceeding the
RLIMIT_NPROC
resource limit, which can usually be increased; see Limits on Resources.ENOMEM
- The process requires more space than the system can supply.
The specific attributes of the child process that differ from the parent process are:
The
vfork
function is similar tofork
but on some systems it is more efficient; however, there are restrictions you must follow to use it safely.While
fork
makes a complete copy of the calling process's address space and allows both the parent and child to execute independently,vfork
does not make this copy. Instead, the child process created withvfork
shares its parent's address space until it calls_exit
or one of theexec
functions. In the meantime, the parent process suspends execution.You must be very careful not to allow the child process created with
vfork
to modify any global data or even local variables shared with the parent. Furthermore, the child process cannot return from (or do a long jump out of) the function that calledvfork
! This would leave the parent process's control information very confused. If in doubt, usefork
instead.Some operating systems don't really implement
vfork
. The GNU C Library permits you to usevfork
on all systems, but actually executesfork
ifvfork
isn't available. If you follow the proper precautions for usingvfork
, your program will still work even if the system usesfork
instead.