vfork
- spawn new process in a virtual memory efficient way
LIBRARY
Lb libc
SYNOPSIS
#include <unistd.h> pid_t
vfork (void);
DESCRIPTION
The
vfork ();
system call
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(2)
would have been to create a new system context for an
execve(2).
The
vfork ();
system call
differs from
fork(2)
in that the child borrows the parent's memory and thread of
control until a call to
execve(2)
or an exit (either by a call to
_exit2
or abnormally).
The parent process is suspended while the child is using its resources.
The
vfork ();
system call
returns 0 in the child's context and (later) the pid of the child in
the parent's context.
The
vfork ();
system call
can normally be used just like
fork(2).
It does not work, however, to return while running in the child's context
from the procedure that called
vfork ();
since the eventual return from
vfork ();
would then return to a no longer existent stack frame.
Be careful, also, to call
_exit2
rather than
exit(3)
if you cannot
execve(2),
since
exit(3)
will flush and close standard I/O channels, and thereby mess up the
parent processes standard I/O data structures.
(Even with
fork(2)
it is wrong to call
exit(3)
since buffered data would then be flushed twice.)
This system call will be eliminated when proper system sharing
mechanisms are implemented.
Users should not depend on the memory
sharing semantics of
vfork ();
as it will, in that case, be made synonymous to
fork(2).
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.