Print this page
5776 vfork and getwd should not be exposed under XPG7
*** 1,179 ****
! '\" te
.\" Copyright (c) 2004, Sun Microsystems, Inc. All Rights Reserved.
.\" Copyright 1989 AT&T.
! .\" Copyright (c) 1980 Regents of the University of California. All rights reserved. The Berkeley software License Agreement specifies the terms and conditions for redistribution.
! .TH VFORK 2 "Dec 13, 2006"
! .SH NAME
! vfork, vforkx \- spawn new process in a virtual memory efficient way
! .SH SYNOPSIS
! .LP
! .nf
! #include <unistd.h>
!
! \fBpid_t\fR \fBvfork\fR(\fBvoid\fR);
! .fi
!
! .LP
! .nf
! #include <sys/fork.h>
!
! \fBpid_t\fR \fBvforkx\fR(\fBint\fR \fIflags\fR);
! .fi
!
! .SH DESCRIPTION
! .sp
! .LP
! The \fBvfork()\fR and \fBvforkx()\fR 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 \fBfork\fR(2) operation is to create a new
! system context for an \fBexecve()\fR operation (see \fBexec\fR(2)).
! .sp
! .LP
! Unlike with the \fBfork()\fR function, the child process borrows the parent's
! memory and thread of control until a call to \fBexecve()\fR or an exit (either
! abnormally or by a call to \fB_exit()\fR (see \fBexit\fR(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 \fBvfork()\fR or \fBvforkx()\fR. The
! parent process is suspended while the child is using its resources.
! .sp
! .LP
! In a multithreaded application, \fBvfork()\fR and \fBvforkx()\fR borrow only
! the thread of control that called \fBvfork()\fR or \fBvforkx()\fR in the
! parent; that is, the child contains only one thread. The use of \fBvfork()\fR
! or \fBvforkx()\fR 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.
! .sp
! .LP
! The \fBvfork()\fR and \fBvforkx()\fR functions can normally be used the same
! way as \fBfork()\fR and \fBforkx()\fR, respectively. The calling procedure,
however, should not return while running in the child's context, since the
! eventual return from \fBvfork()\fR or \fBvforkx()\fR in the parent would be to
! a stack frame that no longer exists. The \fB_exit()\fR function should be used
! in favor of \fBexit\fR(3C) if unable to perform an \fBexecve()\fR operation,
! since \fBexit()\fR will invoke all functions registered by \fBatexit\fR(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 \fBvfork()\fR or \fBvforkx()\fR, unless such an effect
is intentional.
! .sp
! .LP
! Unlike \fBfork()\fR and \fBforkx()\fR, fork handlers are not run when
! \fBvfork()\fR and \fBvforkx()\fR are called.
! .sp
! .LP
! The \fBvfork()\fR and \fBvforkx()\fR functions are deprecated. Their sole
legitimate use as a prelude to an immediate call to a function from the
! \fBexec\fR family can be achieved safely by \fBposix_spawn\fR(3C) or
! \fBposix_spawnp\fR(3C).
! .SS "Fork Extensions"
! .sp
! .LP
! The \fBvforkx()\fR function accepts a \fIflags\fR argument consisting of a
bitwise inclusive-OR of zero or more of the following flags, which are defined
! in the header \fB<sys/fork.h>\fR:
! .br
! .in +2
! \fBFORK_NOSIGCHLD\fR
! .in -2
! .br
! .in +2
! \fBFORK_WAITPID\fR
! .in -2
! .sp
! .LP
! See \fBfork\fR(2) for descriptions of these flags. If the \fIflags\fR argument
! is 0, \fBvforkx()\fR is identical to \fBvfork()\fR.
! .SH RETURN VALUES
! .sp
! .LP
! Upon successful completion, \fBvfork()\fR and \fBvforkx()\fR return \fB0\fR to
! the child process and returns the process ID of the child process to the parent
! process. Otherwise, \fB\(mi1\fR is returned to the parent process, no child
! process is created, and \fBerrno\fR is set to indicate the error.
! .SH ERRORS
! .sp
! .LP
! The \fBvfork()\fR and \fBvforkx()\fR functions will fail if:
! .sp
! .ne 2
! .na
! \fB\fBEAGAIN\fR\fR
! .ad
! .RS 10n
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.
! .RE
!
! .sp
! .ne 2
! .na
! \fB\fBENOMEM\fR\fR
! .ad
! .RS 10n
There is insufficient swap space for the new process.
! .RE
!
! .sp
! .LP
! The \fBvforkx()\fR function will fail if:
! .sp
! .ne 2
! .na
! \fB\fBEINVAL\fR\fR
! .ad
! .RS 10n
! The \fIflags\fR argument is invalid.
! .RE
!
! .SH ATTRIBUTES
! .sp
! .LP
! See \fBattributes\fR(5) for descriptions of the following attributes:
! .sp
!
! .sp
! .TS
! box;
! c | c
! l | l .
! ATTRIBUTE TYPE ATTRIBUTE VALUE
! _
! Interface Stability Obsolete
! _
! MT-Level Unsafe
! .TE
!
! .SH SEE ALSO
! .sp
! .LP
! \fBexec\fR(2), \fBexit\fR(2), \fBfork\fR(2), \fBioctl\fR(2), \fBatexit\fR(3C),
! \fBexit\fR(3C), \fBposix_spawn\fR(3C), \fBposix_spawnp\fR(3C),
! \fBsignal.h\fR(3HEAD), \fBwait\fR(3C), \fBattributes\fR(5), \fBstandards\fR(5)
! .SH NOTES
! .sp
! .LP
To avoid a possible deadlock situation, processes that are children in the
! middle of a \fBvfork()\fR or \fBvforkx()\fR are never sent \fBSIGTTOU\fR or
! \fBSIGTTIN\fR signals; rather, output or ioctls are allowed and input attempts
! result in an \fBEOF\fR indication.
! .sp
! .LP
To forestall parent memory corruption due to race conditions with signal
! handling, \fBvfork()\fR and \fBvforkx()\fR treat signal handlers in the child
! process in the same manner as the \fBexec\fR(2) functions: signals set to be
! caught by the parent process are set to the default action (\fBSIG_DFL\fR) in
! the child process (see \fBsignal.h\fR(3HEAD)). Any attempt to set a signal
! handler in the child before \fBexecve()\fR to anything other than \fBSIG_DFL\fR
! or \fBSIG_IGN\fR is disallowed and results in setting the handler to
! \fBSIG_DFL\fR.
! .sp
! .LP
! On some systems, the implementation of \fBvfork()\fR and \fBvforkx()\fR cause
the parent to inherit register values from the child. This can create problems
! for certain optimizing compilers if \fB<unistd.h>\fR is not included in the
! source calling \fBvfork()\fR or if \fB<sys/fork.h>\fR is not included in the
! source calling \fBvforkx()\fR.
--- 1,286 ----
! .\" Copyright 2014 Garrett D'Amore <garrett@damore.org>
.\" Copyright (c) 2004, Sun Microsystems, Inc. All Rights Reserved.
.\" Copyright 1989 AT&T.
! .\" Copyright (c) 1980 Regents of the University of California.
! .\" All rights reserved. The Berkeley software License Agreement
! .\" specifies the terms and conditions for redistribution.
! .Dd Aug 20, 2014
! .Dt VFORK 2
! .Os
! .Sh NAME
! .Nm vfork ,
! .Nm vforkx
! .Nd spawn new process in a virtual memory efficient way
! .Sh SYNOPSIS
! .In unistd.h
! .Ft pid_t
! .Fn vfork void
! .
! .In sys/fork.h
! .Ft pid_t
! .Fn vforkx "int flags"
! .Sh DESCRIPTION
! The
! .Fn vfork
! and
! .Fn 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
! .Xr fork 2
! operation is to create a new
! system context for an
! .Xr exec 2
! operation.
! .Lp
! Unlike with the
! .Fn fork
! function, the child process borrows the parent's
! memory and thread of control until a call to
! .Fn execve
! or an exit
! .Pq either abnormally or by a call to Xr _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
! .Fn vfork
! or
! .Fn vforkx .
! The parent process is suspended while the child is using its resources.
! .Lp
! In a multithreaded application,
! .Fn vfork
! and
! .Fn vforkx
! borrow only the thread of control that called
! .Fn vfork
! or
! .Fn vforkx
! in the parent; that is, the child contains only one thread. The use of
! .Fn vfork
! or
! .Fn 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.
! .Lp
! The
! .Fn vfork
! and
! .Fn vforkx
! functions can normally be used the same way as
! .Fn fork
! and
! .Fn forkx ,
! respectively. The calling procedure,
however, should not return while running in the child's context, since the
! eventual return from
! .Fn vfork
! or
! .Fn vforkx
! in the parent would be to
! a stack frame that no longer exists. The
! .Fn _exit
! function should be used
! in favor of
! .Xr exit 3C
! if unable to perform an
! .Fn execve
! operation, since
! .Fn exit
! will invoke all functions registered by
! .Xr 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
! .Fn vfork
! or
! .Fn vforkx ,
! unless such an effect
is intentional.
! .Lp
! Unlike
! .Fn fork
! and
! .Fn forkx ,
! fork handlers are not run when
! .Fn vfork
! and
! .Fn vforkx
! are called.
! .Lp
! The
! .Fn vfork
! and
! .Fn vforkx
! functions are deprecated. Their sole
legitimate use as a prelude to an immediate call to a function from the
! .Xr exec 2
! family can be achieved safely by
! .Xr posix_spawn 3C
! or
! .Xr posix_spawnp 3C .
! .Ss "Fork Extensions"
! The
! .Fn vforkx
! function accepts a
! .Fa flags
! argument consisting of a
bitwise inclusive-OR of zero or more of the following flags, which are defined
! in the header
! .In sys/fork.h :
! .Lp
! .Bl -item -compact -offset indent
! .It
! .Dv FORK_NOSIGCHLD
! .It
! .Dv FORK_WAITPID
! .El
! .Lp
! See
! .Xr fork 2
! for descriptions of these flags. If the
! .Fa flags
! argument is 0,
! .Fn vforkx
! is identical to
! .Fn vfork .
! .Sh RETURN VALUES
! Upon successful completion,
! .Fn vfork
! and
! .Fn vforkx
! return 0 to
! the child process and return the process ID of the child process to the parent
! process. Otherwise, \(mi1 is returned to the parent process, no child
! process is created, and
! .Va errno
! is set to indicate the error.
! .Sh ERRORS
! The
! .Fn vfork
! and
! .Fn vforkx
! functions will fail if:
! .Bl -tag -width Er
! .It Er 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.
! .
! .It Er ENOMEM
There is insufficient swap space for the new process.
! .El
! .Lp
! The
! .Fn vforkx
! function will fail if:
! .Bl -tag -width Er
! .It Er EINVAL
! The
! .Va flags
! argument is invalid.
! .El
! .Sh INTERFACE STABILITY
! The
! .Fn vfork
! function is
! .Sy Obsolete Standard .
! .Lp
! The
! .Fn vforkx
! function is
! .Sy Obsolete Uncommitted .
! .Sh MT-LEVEL
! .Sy Unsafe .
! .Sh SEE ALSO
! .Xr exec 2 ,
! .Xr exit 2 ,
! .Xr fork 2 ,
! .Xr ioctl 2 ,
! .Xr atexit 3C ,
! .Xr exit 3C ,
! .Xr posix_spawn 3C ,
! .Xr posix_spawnp 3C ,
! .Xr signal.h 3HEAD ,
! .Xr wait 3C ,
! .Xr standards 5
! .Sh NOTES
To avoid a possible deadlock situation, processes that are children in the
! middle of a
! .Fn vfork
! or
! .Fn vforkx
! are never sent
! .Dv SIGTTOU
! or
! .Dv SIGTTIN
! signals; rather, output or ioctls are allowed and input attempts
! result in an
! .Dv EOF
! indication.
! .Lp
To forestall parent memory corruption due to race conditions with signal
! handling,
! .Fn vfork
! and
! .Fn vforkx
! treat signal handlers in the child
! process in the same manner as the
! .Xr exec 2
! functions: signals set to be
! caught by the parent process are set to the default action
! .Pq Dv SIG_DFL
! in the child process
! .Pq see Xr signal.h 3HEAD .
! Any attempt to set a signal
! handler in the child before
! .Fn execve
! to anything other than
! .Dv SIG_DFL
! or
! .Dv SIG_IGN
! is disallowed and results in setting the handler to
! .Dv SIG_DFL .
! .Lp
! On some systems, the implementation of
! .Fn vfork
! and
! .Fn vforkx
! cause
the parent to inherit register values from the child. This can create problems
! for certain optimizing compilers if
! .In unistd.h
! is not included in the source calling
! .Fn vfork
! or if
! .In sys/fork.h
! is not included in the
! source calling
! .Fn vforkx .
! .Sh STANDARDS
! The
! .Fn vfork
! function is available in the following compilation environments. See
! .Xr standards 5 .
! .Lp
! .Bl -bullet -compact
! .It
! .St -xpg4.2
! .It
! .St -susv2
! .It
! .St -susv3
! .El
! .Lp
! It was marked obsolete in
! .St -susv3
! and removed from
! .St -p1003.1-2008 .
! .Lp
! The
! .Fn vforkx
! function is a local extension and not available in any strictly
! standards-compliant compilation environment.