Print this page
5776 vfork and getwd should not be exposed under XPG7
@@ -1,149 +1,135 @@
VFORK(2) System Calls VFORK(2)
-
-
NAME
- vfork, vforkx - spawn new process in a virtual memory efficient way
+ vfork, vforkx spawn new process in a virtual memory efficient way
SYNOPSIS
#include <unistd.h>
- pid_t vfork(void);
+ pid_t
+ vfork(void);
-
#include <sys/fork.h>
- pid_t vforkx(int flags);
+ pid_t
+ vforkx(int flags);
-
DESCRIPTION
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 execve() operation (see exec(2)).
+ 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() (see 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.
+ 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.
+ 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.
+ 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 vfork() and vforkx() functions are deprecated. Their sole
- legitimate use as a prelude to an immediate call to a function from the
- exec family can be achieved safely by posix_spawn(3C) or
- posix_spawnp(3C).
-
Fork Extensions
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>:
+ inclusive-OR of zero or more of the following flags, which are defined in
+ the header <sys/fork.h>:
+
FORK_NOSIGCHLD
FORK_WAITPID
+ See fork(2) for descriptions of these flags. If the flags argument is 0,
+ vforkx() is identical to vfork().
- See fork(2) for descriptions of these flags. If the flags argument is
- 0, vforkx() is identical to vfork().
-
RETURN VALUES
Upon successful completion, vfork() and vforkx() return 0 to the child
- process and returns 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.
+ 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.
ERRORS
The vfork() and vforkx() functions will fail if:
- EAGAIN
- The system-imposed limit on the total number of processes
- under execution (either system-quality or by a single user)
- would be exceeded. This limit is determined when the system
- is generated.
+ EAGAIN The system-imposed limit on the total number of
+ processes under execution (either system-quality or by
+ a single user) would be exceeded. This limit is
+ determined when the system is generated.
+ ENOMEM There is insufficient swap space for the new process.
- ENOMEM
- There is insufficient swap space for the new process.
-
-
-
The vforkx() function will fail if:
- EINVAL
- The flags argument is invalid.
+ EINVAL The flags argument is invalid.
+INTERFACE STABILITY
+ The vfork() function is Obsolete Standard.
-ATTRIBUTES
- See attributes(5) for descriptions of the following attributes:
+ The vforkx() function is Obsolete Uncommitted.
+MT-LEVEL
+ Unsafe.
-
-
- +--------------------+-----------------+
- | ATTRIBUTE TYPE | ATTRIBUTE VALUE |
- +--------------------+-----------------+
- |Interface Stability | Obsolete |
- +--------------------+-----------------+
- |MT-Level | Unsafe |
- +--------------------+-----------------+
-
SEE ALSO
exec(2), exit(2), fork(2), ioctl(2), atexit(3C), exit(3C),
posix_spawn(3C), posix_spawnp(3C), signal.h(3HEAD), wait(3C),
- attributes(5), standards(5)
+ standards(5)
NOTES
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.
- 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().
+STANDARDS
+ The vfork() function is available in the following compilation
+ environments. See standards(5).
+ X/Open Portability Guide Issue4, Version2 (XPG4.2)
+ Version2 of the Single UNIX Specification (SUSv2)
+ Version3 of the Single UNIX Specification (SUSv3)
- December 13, 2006 VFORK(2)
+ It was marked obsolete in Version3 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.
+
+illumos August 20, 2014 illumos