vfork();
was originally used to create new processes without fully copying the address
space of the old process, which is horrendously inefficient in a paged
environment.
It was useful when the purpose of
fork(2)
would have been to create a new system context for an
execve(2).
Since
fork(2)
is now efficient, even in the above case, the need for
vfork();
has diminished.
vfork();
differs from
fork(2)
in that the parent is suspended until the child makes a call to
execve(2)
or an exit (either by a call to
_exit(2)
or abnormally).
In addition, fork handlers established using
pthread_atfork(3)
are not called when a multithreaded program calls
vfork();.
vfork();
returns 0 in the child's context and (later) the PID of the child in
the parent's context.
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
ioctl(2)
calls are allowed and input attempts result in an end-of-file indication.