Print this page
5776 vfork and getwd should not be exposed under XPG7

*** 1,149 **** VFORK(2) System Calls VFORK(2) - - NAME ! vfork, vforkx - spawn new process in a virtual memory efficient way SYNOPSIS #include <unistd.h> ! pid_t vfork(void); - #include <sys/fork.h> ! 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)). - 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. - 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 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>: FORK_NOSIGCHLD FORK_WAITPID - 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. 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. - ENOMEM - There is insufficient swap space for the new process. - - - The vforkx() function will fail if: ! EINVAL ! The flags argument is invalid. ! ATTRIBUTES ! See attributes(5) for descriptions of the following attributes: - - - +--------------------+-----------------+ - | 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) 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. - - 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(). ! December 13, 2006 VFORK(2) --- 1,135 ---- VFORK(2) System Calls VFORK(2) NAME ! vfork, vforkx spawn new process in a virtual memory efficient way SYNOPSIS #include <unistd.h> ! pid_t ! vfork(void); #include <sys/fork.h> ! 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 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). 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>: ! FORK_NOSIGCHLD FORK_WAITPID + 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 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. + ENOMEM There is insufficient swap space for the new process. The vforkx() function will fail if: ! EINVAL The flags argument is invalid. + INTERFACE STABILITY + The vfork() function is Obsolete Standard. ! The vforkx() function is Obsolete Uncommitted. + 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), ! 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. 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) ! 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