VFORK(2) | System Calls | VFORK(2) |
vfork
, vforkx
—
#include <unistd.h>
pid_t
vfork
(void);
#include
<sys/fork.h>
pid_t
vforkx
(int
flags);
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).
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
().
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.
vfork
() and vforkx
()
functions will fail if:
EAGAIN
ENOMEM
The vforkx
() function will fail if:
EINVAL
vfork
() function is Obsolete
Standard.
The vforkx
() function is
Obsolete Uncommitted.
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
().
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 |