VFORK(2) | System Calls | VFORK(2) |
vfork
, vforkx
— spawn new process in a virtual memory efficient
way
#include
<unistd.h>
pid_t
vfork
(void);
#include
<sys/fork.h>
pid_t
vforkx
(int
flags);
The
vfork
()
and vforkx
() functions create a new process without
fully copying the address space of the old process. These functions are
useful in instances where the purpose of a
fork(2) operation is to create a new
system context for an exec(2)
operation.
Unlike with the
fork
()
function, the child process borrows the parent's memory and thread of
control until a call to
execve
()
or an exit (either abnormally or by a call to
_exit(2)). Any modification made during
this time to any part of memory in the child process is reflected in the
parent process on return from vfork
() or
vforkx
(). The parent process is suspended while the
child is using its resources.
In a multithreaded application,
vfork
() and
vforkx
() borrow only the thread of control that
called vfork
() or vforkx
()
in the parent; that is, the child contains only one thread. The use of
vfork
() or vforkx
() in
multithreaded applications, however, is unsafe due to race conditions that
can cause the child process to become deadlocked and consequently block both
the child and parent process from execution indefinitely.
The
vfork
() and
vforkx
() functions can normally be used the same way
as fork
() and forkx
(),
respectively. The calling procedure, however, should not return while
running in the child's context, since the eventual return from
vfork
() or vforkx
() in the
parent would be to a stack frame that no longer exists. The
_exit
()
function should be used in favor of
exit(3C) if unable to perform an
execve
() operation, since
exit
()
will invoke all functions registered by
atexit(3C) and will flush and close
standard I/O channels, thereby corrupting the parent process's standard I/O
data structures. Care must be taken in the child process not to modify any
global or local data that affects the behavior of the parent process on
return from vfork
() or
vforkx
(), unless such an effect is intentional.
Unlike
fork
() and
forkx
(),
fork handlers are not run when vfork
() and
vforkx
() are called.
The
vfork
() and
vforkx
() functions are deprecated. Their sole
legitimate use as a prelude to an immediate call to a function from the
exec(2) family can be achieved safely by
posix_spawn(3C) or
posix_spawnp(3C).
The vforkx
() function accepts a
flags argument consisting of a bitwise inclusive-OR of
zero or more of the following flags, which are defined in the header
<sys/fork.h>
:
See fork(2) for
descriptions of these flags. If the flags argument is
0, vforkx
()
is identical to vfork
().
Upon successful completion, vfork
() and
vforkx
() return 0 to the child process and return
the process ID of the child process to the parent process. Otherwise,
−1 is returned to the parent process, no child process is created,
and errno is set to indicate the error.
The vfork
() and
vforkx
() functions will fail if:
EAGAIN
ENOMEM
The vforkx
() function will fail if:
EINVAL
The
vfork
()
function is Obsolete Standard.
The
vforkx
()
function is Obsolete Uncommitted.
exec(2), exit(2), fork(2), ioctl(2), atexit(3C), exit(3C), posix_spawn(3C), posix_spawnp(3C), wait(3C), signal.h(3HEAD), standards(7)
To avoid a possible deadlock situation, processes that are
children in the middle of a vfork
() or
vforkx
() are never sent
SIGTTOU
or SIGTTIN
signals;
rather, output or ioctls are allowed and input attempts result in an
EOF
indication.
To forestall parent memory corruption due to race
conditions with signal handling,
vfork
() and
vforkx
() treat signal handlers in the child process
in the same manner as the exec(2)
functions: signals set to be caught by the parent process are set to the
default action (SIG_DFL
) in the child process (see
signal.h(3HEAD)). Any attempt to
set a signal handler in the child before execve
() to
anything other than SIG_DFL
or
SIG_IGN
is disallowed and results in setting the
handler to SIG_DFL
.
On some systems, the implementation of
vfork
() and
vforkx
() cause the parent to inherit register values
from the child. This can create problems for certain optimizing compilers if
<unistd.h>
is not included
in the source calling vfork
() or if
<sys/fork.h>
is not included
in the source calling vforkx
().
The vfork
() function is available in the
following compilation environments. See
standards(7).
It was marked obsolete in Version 3 of the Single UNIX Specification (“SUSv3”) and removed from IEEE Std 1003.1-2008 (“POSIX.1”).
The vforkx
() function is a local extension
and not available in any strictly standards-compliant compilation
environment.
August 20, 2014 | OmniOS |