VFORK(2) System Calls Manual VFORK(2)
vfork - spawn new process in a virtual memory efficient way
vfork() can be used to create new processes without fully copying the
address space of the old process, which is horrendously inefficient in
a paged environment. It is useful when the purpose of fork(2V), would
have been to create a new system context for an execve(2V). vfork()
differs from fork() in that the child borrows the parent's memory and
thread of control until a call to execve(2V), or an exit (either by a
call to exit(2V) or abnormally.) The parent process is suspended while
the child is using its resources.
vfork() returns 0 in the child's context and (later) the process ID
(PID) of the child in the parent's context.
vfork() can normally be used just like fork. It does not work, how-
ever, to return while running in the child's context from the procedure
which called vfork() since the eventual return from vfork() would then
return to a no longer existent stack frame. Be careful, also, to call
_exit() rather than exit() if you cannot execve, since exit() will
flush and close standard I/O channels, and thereby mess up the parent
processes standard I/O data structures. (Even with fork() it is wrong
to call exit() since buffered data would then be flushed twice.)
On Sun-4 machines, the parent inherits the values of local and incoming
argument registers from the child. Since this violates the usual data
flow properties of procedure calls, the file <<vfork.h>> must be included
in programs that are compiled using global optimization.
On success, vfork() returns 0 to the child process and returns the
process ID of the child process to the parent process. On failure,
vfork() returns -1 to the parent process, sets errno to indicate the
error, and no child process is created.
execve(2V), exit(2V), fork(2V), ioctl(2), sigvec(2), wait(2V)
This system call will be eliminated in a future release. System imple-
mentation changes are making the efficiency gain of vfork() over
fork(2V) smaller. The memory sharing semantics of vfork() can be
obtained through other mechanisms.
To avoid a possible deadlock situation, processes that are children in
the middle of a vfork() are never sent SIGTTOU or SIGTTIN signals;
rather, output or ioctls are allowed and input attempts result in an
21 January 1990 VFORK(2)