summaryrefslogtreecommitdiffstats
path: root/man-pages-posix-2003/man3p/posix_spawn.3p
diff options
context:
space:
mode:
Diffstat (limited to 'man-pages-posix-2003/man3p/posix_spawn.3p')
-rw-r--r--man-pages-posix-2003/man3p/posix_spawn.3p636
1 files changed, 636 insertions, 0 deletions
diff --git a/man-pages-posix-2003/man3p/posix_spawn.3p b/man-pages-posix-2003/man3p/posix_spawn.3p
new file mode 100644
index 0000000..8b1a86d
--- /dev/null
+++ b/man-pages-posix-2003/man3p/posix_spawn.3p
@@ -0,0 +1,636 @@
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "POSIX_SPAWN" 3P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" posix_spawn
+.SH PROLOG
+This manual page is part of the POSIX Programmer's Manual.
+The Linux implementation of this interface may differ (consult
+the corresponding Linux manual page for details of Linux behavior),
+or the interface may not be implemented on Linux.
+.SH NAME
+posix_spawn, posix_spawnp \- spawn a process (\fBADVANCED REALTIME\fP)
+.SH SYNOPSIS
+.LP
+\fB#include <spawn.h>
+.br
+.sp
+int posix_spawn(pid_t *restrict\fP \fIpid\fP\fB, const char *restrict\fP
+\fIpath\fP\fB,
+.br
+\ \ \ \ \ \ const posix_spawn_file_actions_t *\fP\fIfile_actions\fP\fB,
+.br
+\ \ \ \ \ \ const posix_spawnattr_t *restrict\fP \fIattrp\fP\fB,
+.br
+\ \ \ \ \ \ char *const\fP \fIargv\fP\fB[restrict], char *const\fP
+\fIenvp\fP\fB[restrict]);
+.br
+int posix_spawnp(pid_t *restrict\fP \fIpid\fP\fB, const char *restrict\fP
+\fIfile\fP\fB,
+.br
+\ \ \ \ \ \ const posix_spawn_file_actions_t *\fP\fIfile_actions\fP\fB,
+.br
+\ \ \ \ \ \ const posix_spawnattr_t *restrict\fP \fIattrp\fP\fB,
+.br
+\ \ \ \ \ \ char *const\fP \fIargv\fP\fB[restrict], char * const\fP
+\fIenvp\fP\fB[restrict]);
+\fP
+\fB
+.br
+\fP
+.SH DESCRIPTION
+.LP
+The \fIposix_spawn\fP() and \fIposix_spawnp\fP() functions shall create
+a new process (child process) from the specified
+process image. The new process image shall be constructed from a regular
+executable file called the new process image file.
+.LP
+When a C program is executed as the result of this call, it shall
+be entered as a C-language function call as follows:
+.sp
+.RS
+.nf
+
+\fBint main(int\fP \fIargc\fP\fB, char *\fP\fIargv\fP\fB[]);
+\fP
+.fi
+.RE
+.LP
+where \fIargc\fP is the argument count and \fIargv\fP is an array
+of character pointers to the arguments themselves. In
+addition, the following variable:
+.sp
+.RS
+.nf
+
+\fBextern char **environ;
+\fP
+.fi
+.RE
+.LP
+shall be initialized as a pointer to an array of character pointers
+to the environment strings.
+.LP
+The argument \fIargv\fP is an array of character pointers to null-terminated
+strings. The last member of this array shall be a
+null pointer and is not counted in \fIargc\fP. These strings constitute
+the argument list available to the new process image. The
+value in \fIargv\fP[0] should point to a filename that is associated
+with the process image being started by the
+\fIposix_spawn\fP() or \fIposix_spawnp\fP() function.
+.LP
+The argument \fIenvp\fP is an array of character pointers to null-terminated
+strings. These strings constitute the environment
+for the new process image. The environment array is terminated by
+a null pointer.
+.LP
+The number of bytes available for the child process' combined argument
+and environment lists is {ARG_MAX}. The implementation
+shall specify in the system documentation (see the Base Definitions
+volume of IEEE\ Std\ 1003.1-2001, Chapter 2, Conformance) whether
+any list overhead, such as length words, null terminators,
+pointers, or alignment bytes, is included in this total.
+.LP
+The \fIpath\fP argument to \fIposix_spawn\fP() is a pathname that
+identifies the new process image file to execute.
+.LP
+The \fIfile\fP parameter to \fIposix_spawnp\fP() shall be used to
+construct a pathname that identifies the new process image
+file. If the \fIfile\fP parameter contains a slash character, the
+\fIfile\fP parameter shall be used as the pathname for the new
+process image file. Otherwise, the path prefix for this file shall
+be obtained by a search of the directories passed as the
+environment variable \fIPATH\fP (see the Base Definitions volume of
+IEEE\ Std\ 1003.1-2001, Chapter 8, Environment Variables). If this
+environment variable is not defined, the results of
+the search are implementation-defined.
+.LP
+If \fIfile_actions\fP is a null pointer, then file descriptors open
+in the calling process shall remain open in the child
+process, except for those whose close-on- \fIexec\fP flag FD_CLOEXEC
+is set (see \fIfcntl\fP()). For those file descriptors that remain
+open, all attributes of the corresponding open file
+descriptions, including file locks (see \fIfcntl\fP()), shall remain
+unchanged.
+.LP
+If \fIfile_actions\fP is not NULL, then the file descriptors open
+in the child process shall be those open in the calling
+process as modified by the spawn file actions object pointed to by
+\fIfile_actions\fP and the FD_CLOEXEC flag of each remaining
+open file descriptor after the spawn file actions have been processed.
+The effective order of processing the spawn file actions
+shall be:
+.IP " 1." 4
+The set of open file descriptors for the child process shall initially
+be the same set as is open for the calling process. All
+attributes of the corresponding open file descriptions, including
+file locks (see \fIfcntl\fP()), shall
+remain unchanged.
+.LP
+.IP " 2." 4
+The signal mask, signal default actions, and the effective user and
+group IDs for the child process shall be changed as
+specified in the attributes object referenced by \fIattrp\fP.
+.LP
+.IP " 3." 4
+The file actions specified by the spawn file actions object shall
+be performed in the order in which they were added to the
+spawn file actions object.
+.LP
+.IP " 4." 4
+Any file descriptor that has its FD_CLOEXEC flag set (see \fIfcntl\fP()
+) shall be closed.
+.LP
+.LP
+The \fBposix_spawnattr_t\fP spawn attributes object type is defined
+in \fI<spawn.h>\fP. It shall contain at least the attributes defined
+below.
+.LP
+If the POSIX_SPAWN_SETPGROUP flag is set in the \fIspawn-flags\fP
+attribute of the object referenced by \fIattrp\fP, and the
+\fIspawn-pgroup\fP attribute of the same object is non-zero, then
+the child's process group shall be as specified in the
+\fIspawn-pgroup\fP attribute of the object referenced by \fIattrp\fP.
+.LP
+As a special case, if the POSIX_SPAWN_SETPGROUP flag is set in the
+\fIspawn-flags\fP attribute of the object referenced by
+\fIattrp\fP, and the \fIspawn-pgroup\fP attribute of the same object
+is set to zero, then the child shall be in a new process
+group with a process group ID equal to its process ID.
+.LP
+If the POSIX_SPAWN_SETPGROUP flag is not set in the \fIspawn-flags\fP
+attribute of the object referenced by \fIattrp\fP, the
+new child process shall inherit the parent's process group.
+.LP
+If
+the POSIX_SPAWN_SETSCHEDPARAM flag is set in the \fIspawn-flags\fP
+attribute of the object referenced by \fIattrp\fP, but
+POSIX_SPAWN_SETSCHEDULER is not set, the new process image shall initially
+have the scheduling policy of the calling process with
+the scheduling parameters specified in the \fIspawn-schedparam\fP
+attribute of the object referenced by \fIattrp\fP.
+.LP
+If the POSIX_SPAWN_SETSCHEDULER flag is set in the \fIspawn-flags\fP
+attribute of the object referenced by \fIattrp\fP
+(regardless of the setting of the POSIX_SPAWN_SETSCHEDPARAM flag),
+the new process image shall initially have the scheduling policy
+specified in the \fIspawn-schedpolicy\fP attribute of the object referenced
+by \fIattrp\fP and the scheduling parameters
+specified in the \fIspawn-schedparam\fP attribute of the same object.
+.LP
+The POSIX_SPAWN_RESETIDS flag in the \fIspawn-flags\fP attribute of
+the object referenced by \fIattrp\fP governs the effective
+user ID of the child process. If this flag is not set, the child process
+shall inherit the parent process' effective user ID. If
+this flag is set, the child process' effective user ID shall be reset
+to the parent's real user ID. In either case, if the
+set-user-ID mode bit of the new process image file is set, the effective
+user ID of the child process shall become that file's
+owner ID before the new process image begins execution.
+.LP
+The POSIX_SPAWN_RESETIDS flag in the \fIspawn-flags\fP attribute of
+the object referenced by \fIattrp\fP also governs the
+effective group ID of the child process. If this flag is not set,
+the child process shall inherit the parent process' effective
+group ID. If this flag is set, the child process' effective group
+ID shall be reset to the parent's real group ID. In either case,
+if the set-group-ID mode bit of the new process image file is set,
+the effective group ID of the child process shall become that
+file's group ID before the new process image begins execution.
+.LP
+If the POSIX_SPAWN_SETSIGMASK flag is set in the \fIspawn-flags\fP
+attribute of the object referenced by \fIattrp\fP, the
+child process shall initially have the signal mask specified in the
+\fIspawn-sigmask\fP attribute of the object referenced by
+\fIattrp\fP.
+.LP
+If the POSIX_SPAWN_SETSIGDEF flag is set in the \fIspawn-flags\fP
+attribute of the object referenced by \fIattrp\fP, the
+signals specified in the \fIspawn-sigdefault\fP attribute of the same
+object shall be set to their default actions in the child
+process. Signals set to the default action in the parent process shall
+be set to the default action in the child process.
+.LP
+Signals set to be caught by the calling process shall be set to the
+default action in the child process.
+.LP
+Except for SIGCHLD, signals set to be ignored by the calling process
+image shall be set to be ignored by the child process,
+unless otherwise specified by the POSIX_SPAWN_SETSIGDEF flag being
+set in the \fIspawn-flags\fP attribute of the object referenced
+by \fIattrp\fP and the signals being indicated in the \fIspawn-sigdefault\fP
+attribute of the object referenced by
+\fIattrp\fP.
+.LP
+If the SIGCHLD signal is set to be ignored by the calling process,
+it is unspecified whether the SIGCHLD signal is set to be
+ignored or to the default action in the child process, unless otherwise
+specified by the POSIX_SPAWN_SETSIGDEF flag being set in
+the \fIspawn_flags\fP attribute of the object referenced by \fIattrp\fP
+and the SIGCHLD signal being indicated in the
+\fIspawn_sigdefault\fP attribute of the object referenced by \fIattrp\fP.
+.LP
+If the value of the \fIattrp\fP pointer is NULL, then the default
+values are used.
+.LP
+All process attributes, other than those influenced by the attributes
+set in the object referenced by \fIattrp\fP as specified
+above or by the file descriptor manipulations specified in \fIfile_actions\fP,
+shall appear in the new process image as though \fIfork\fP() had been
+called to create a child process and then a member of the \fIexec\fP
+family of functions had been called by the child process to execute
+the new process
+image.
+.LP
+It is implementation-defined whether the fork handlers are run when
+\fIposix_spawn\fP() or \fIposix_spawnp\fP() is called.
+.SH RETURN VALUE
+.LP
+Upon successful completion, \fIposix_spawn\fP() and \fIposix_spawnp\fP()
+shall return the process ID of the child process to
+the parent process, in the variable pointed to by a non-NULL \fIpid\fP
+argument, and shall return zero as the function return
+value. Otherwise, no child process shall be created, the value stored
+into the variable pointed to by a non-NULL \fIpid\fP is
+unspecified, and an error number shall be returned as the function
+return value to indicate the error. If the \fIpid\fP argument
+is a null pointer, the process ID of the child is not returned to
+the caller.
+.SH ERRORS
+.LP
+The \fIposix_spawn\fP() and \fIposix_spawnp\fP() functions may fail
+if:
+.TP 7
+.B EINVAL
+The value specified by \fIfile_actions\fP or \fIattrp\fP is invalid.
+.sp
+.LP
+If this error occurs after the calling process successfully returns
+from the \fIposix_spawn\fP() or \fIposix_spawnp\fP()
+function, the child process may exit with exit status 127.
+.LP
+If \fIposix_spawn\fP() or \fIposix_spawnp\fP() fail for any of the
+reasons that would cause \fIfork\fP() or one of the \fIexec\fP family
+of functions to
+fail, an error value shall be returned as described by \fIfork\fP()
+and \fIexec\fP, respectively (or, if the error occurs after the calling
+process successfully returns, the
+child process shall exit with exit status 127).
+.LP
+If POSIX_SPAWN_SETPGROUP is set in the \fIspawn-flags\fP attribute
+of the object referenced by \fIattrp\fP, and
+\fIposix_spawn\fP() or \fIposix_spawnp\fP() fails while changing the
+child's process group, an error value shall be returned as
+described by \fIsetpgid\fP() (or, if the error occurs after the calling
+process
+successfully returns, the child process shall exit with exit status
+127).
+.LP
+If
+POSIX_SPAWN_SETSCHEDPARAM is set and POSIX_SPAWN_SETSCHEDULER is not
+set in the \fIspawn-flags\fP attribute of the object
+referenced by \fIattrp\fP, then if \fIposix_spawn\fP() or \fIposix_spawnp\fP()
+fails for any of the reasons that would cause \fIsched_setparam\fP()
+to fail, an error value shall be returned as described by \fIsched_setparam\fP()
+(or, if the error occurs after the calling process successfully
+returns, the child process shall exit with exit status 127).
+.LP
+If POSIX_SPAWN_SETSCHEDULER is set in the \fIspawn-flags\fP attribute
+of the object referenced by \fIattrp\fP, and if
+\fIposix_spawn\fP() or \fIposix_spawnp\fP() fails for any of the reasons
+that would cause \fIsched_setscheduler\fP() to fail, an error value
+shall be returned as described by \fIsched_setscheduler\fP() (or,
+if the error occurs after the calling process
+successfully returns, the child process shall exit with exit status
+127).
+.LP
+If the \fIfile_actions\fP argument is not NULL, and specifies any
+\fIclose\fP, \fIdup2\fP, or \fIopen\fP actions to be
+performed, and if \fIposix_spawn\fP() or \fIposix_spawnp\fP() fails
+for any of the reasons that would cause \fIclose\fP(), \fIdup2\fP(),
+or \fIopen\fP() to fail, an error value shall be returned as described
+by \fIclose\fP(), \fIdup2\fP(), and \fIopen\fP(), respectively (or,
+if the error occurs after the calling process successfully returns,
+the child process shall exit with exit status 127). An open file action
+may, by itself, result in any of the errors described by \fIclose\fP()
+or \fIdup2\fP(), in addition to those
+described by \fIopen\fP().
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+These functions are part of the Spawn option and need not be provided
+on all implementations.
+.SH RATIONALE
+.LP
+The \fIposix_spawn\fP() function and its close relation \fIposix_spawnp\fP()
+have been introduced to overcome the following
+perceived difficulties with \fIfork\fP(): the \fIfork\fP() function
+is difficult or impossible to implement without swapping or dynamic
+address
+translation.
+.IP " *" 3
+Swapping is generally too slow for a realtime environment.
+.LP
+.IP " *" 3
+Dynamic address translation is not available everywhere that POSIX
+might be useful.
+.LP
+.IP " *" 3
+Processes are too useful to simply option out of POSIX whenever it
+must run without address translation or other MMU
+services.
+.LP
+.LP
+Thus, POSIX needs process creation and file execution primitives that
+can be efficiently implemented without address translation
+or other MMU services.
+.LP
+The \fIposix_spawn\fP() function is implementable as a library routine,
+but both \fIposix_spawn\fP() and \fIposix_spawnp\fP()
+are designed as kernel operations. Also, although they may be an efficient
+replacement for many \fIfork\fP()/ \fIexec\fP pairs, their goal is
+to provide useful
+process creation primitives for systems that have difficulty with
+\fIfork\fP(), not to
+provide drop-in replacements for \fIfork\fP()/ \fIexec\fP.
+.LP
+This view of the role of \fIposix_spawn\fP() and \fIposix_spawnp\fP()
+influenced the design of their API. It does not attempt
+to provide the full functionality of \fIfork\fP()/ \fIexec\fP in which
+arbitrary user-specified operations of any sort are permitted between
+the creation
+of the child process and the execution of the new process image; any
+attempt to reach that level would need to provide a
+programming language as parameters. Instead, \fIposix_spawn\fP() and
+\fIposix_spawnp\fP() are process creation primitives like
+the \fIStart_Process\fP and \fIStart_Process_Search\fP Ada language
+bindings package \fIPOSIX_Process_Primitives\fP and also
+like those in many operating systems that are not UNIX systems, but
+with some POSIX-specific additions.
+.LP
+To achieve its coverage goals, \fIposix_spawn\fP() and \fIposix_spawnp\fP()
+have control of six types of inheritance: file
+descriptors, process group ID, user and group ID, signal mask, scheduling,
+and whether each signal ignored in the parent will
+remain ignored in the child, or be reset to its default action in
+the child.
+.LP
+Control of file descriptors is required to allow an independently
+written child process image to access data streams opened by
+and even generated or read by the parent process without being specifically
+coded to know which parent files and file descriptors
+are to be used. Control of the process group ID is required to control
+how the child process' job control relates to that of the
+parent.
+.LP
+Control of the signal mask and signal defaulting is sufficient to
+support the implementation of \fIsystem\fP(). Although support for
+\fIsystem\fP() is not
+explicitly one of the goals for \fIposix_spawn\fP() and \fIposix_spawnp\fP(),
+it is covered under the "at least 50%" coverage
+goal.
+.LP
+The intention is that the normal file descriptor inheritance across
+\fIfork\fP(), the
+subsequent effect of the specified spawn file actions, and the normal
+file descriptor inheritance across one of the \fIexec\fP family of
+functions should fully specify open file inheritance. The implementation
+need make
+no decisions regarding the set of open file descriptors when the child
+process image begins execution, those decisions having
+already been made by the caller and expressed as the set of open file
+descriptors and their FD_CLOEXEC flags at the time of the
+call and the spawn file actions object specified in the call. We have
+been assured that in cases where the POSIX
+\fIStart_Process\fP Ada primitives have been implemented in a library,
+this method of controlling file descriptor inheritance may
+be implemented very easily.
+.LP
+We can identify several problems with \fIposix_spawn\fP() and \fIposix_spawnp\fP(),
+but there does not appear to be a solution
+that introduces fewer problems. Environment modification for child
+process attributes not specifiable via the \fIattrp\fP or
+\fIfile_actions\fP arguments must be done in the parent process, and
+since the parent generally wants to save its context, it is
+more costly than similar functionality with \fIfork\fP()/ \fIexec\fP.
+It is also complicated to modify the environment of a multi-threaded
+process temporarily,
+since all threads must agree when it is safe for the environment to
+be changed. However, this cost is only borne by those
+invocations of \fIposix_spawn\fP() and \fIposix_spawnp\fP() that use
+the additional functionality. Since extensive modifications
+are not the usual case, and are particularly unlikely in time-critical
+code, keeping much of the environment control out of
+\fIposix_spawn\fP() and \fIposix_spawnp\fP() is appropriate design.
+.LP
+The \fIposix_spawn\fP() and \fIposix_spawnp\fP() functions do not
+have all the power of \fIfork\fP()/ \fIexec\fP. This is to be expected.
+The \fIfork\fP() function is a wonderfully powerful operation. We
+do not expect to duplicate its
+functionality in a simple, fast function with no special hardware
+requirements. It is worth noting that \fIposix_spawn\fP() and
+\fIposix_spawnp\fP() are very similar to the process creation operations
+on many operating systems that are not UNIX systems.
+.SS Requirements
+.LP
+The requirements for \fIposix_spawn\fP() and \fIposix_spawnp\fP()
+are:
+.IP " *" 3
+They must be implementable without an MMU or unusual hardware.
+.LP
+.IP " *" 3
+They must be compatible with existing POSIX standards.
+.LP
+.LP
+Additional goals are:
+.IP " *" 3
+They should be efficiently implementable.
+.LP
+.IP " *" 3
+They should be able to replace at least 50% of typical executions
+of \fIfork\fP().
+.LP
+.IP " *" 3
+A system with \fIposix_spawn\fP() and \fIposix_spawnp\fP() and without
+\fIfork\fP()
+should be useful, at least for realtime applications.
+.LP
+.IP " *" 3
+A system with \fIfork\fP() and the \fIexec\fP family
+should be able to implement \fIposix_spawn\fP() and \fIposix_spawnp\fP()
+as library routines.
+.LP
+.SS Two-Syntax
+.LP
+POSIX \fIexec\fP has several calling sequences with approximately
+the same functionality.
+These appear to be required for compatibility with existing practice.
+Since the existing practice for the \fIposix_spawn*\fP() functions
+is otherwise substantially unlike POSIX, we feel that
+simplicity outweighs compatibility. There are, therefore, only two
+names for the \fIposix_spawn*\fP() functions.
+.LP
+The parameter list does not differ between \fIposix_spawn\fP() and
+\fIposix_spawnp\fP(); \fIposix_spawnp\fP() interprets the
+second parameter more elaborately than \fIposix_spawn\fP().
+.SS Compatibility with POSIX.5 (Ada)
+.LP
+The \fIStart_Process\fP and \fIStart_Process_Search\fP procedures
+from the \fIPOSIX_Process_Primitives\fP package from the
+Ada language binding to POSIX.1 encapsulate \fIfork\fP() and \fIexec\fP
+functionality in a manner similar to that of \fIposix_spawn\fP() and
+\fIposix_spawnp\fP().
+Originally, in keeping with our simplicity goal, the standard developers
+had limited the capabilities of \fIposix_spawn\fP() and
+\fIposix_spawnp\fP() to a subset of the capabilities of \fIStart_Process\fP
+and \fIStart_Process_Search\fP; certain non-default
+capabilities were not supported. However, based on suggestions by
+the ballot group to improve file descriptor mapping or drop it,
+and on the advice of an Ada Language Bindings working group member,
+the standard developers decided that \fIposix_spawn\fP() and
+\fIposix_spawnp\fP() should be sufficiently powerful to implement
+\fIStart_Process\fP and \fIStart_Process_Search\fP. The
+rationale is that if the Ada language binding to such a primitive
+had already been approved as an IEEE standard, there can be
+little justification for not approving the functionally-equivalent
+parts of a C binding. The only three capabilities provided by
+\fIposix_spawn\fP() and \fIposix_spawnp\fP() that are not provided
+by \fIStart_Process\fP and \fIStart_Process_Search\fP are
+optionally specifying the child's process group ID, the set of signals
+to be reset to default signal handling in the child process,
+and the child's scheduling policy and parameters.
+.LP
+For the Ada language binding for \fIStart_Process\fP to be implemented
+with \fIposix_spawn\fP(), that binding would need to
+explicitly pass an empty signal mask and the parent's environment
+to \fIposix_spawn\fP() whenever the caller of
+\fIStart_Process\fP allowed these arguments to default, since \fIposix_spawn\fP()
+does not provide such defaults. The ability of
+\fIStart_Process\fP to mask user-specified signals during its execution
+is functionally unique to the Ada language binding and
+must be dealt with in the binding separately from the call to \fIposix_spawn\fP().
+.SS Process Group
+.LP
+The process group inheritance field can be used to join the child
+process with an existing process group. By assigning a value
+of zero to the \fIspawn-pgroup\fP attribute of the object referenced
+by \fIattrp\fP, the \fIsetpgid\fP() mechanism will place the child
+process in a new process group.
+.SS Threads
+.LP
+Without the \fIposix_spawn\fP() and \fIposix_spawnp\fP() functions,
+systems without address translation can still use threads
+to give an abstraction of concurrency. In many cases, thread creation
+suffices, but it is not always a good substitute. The
+\fIposix_spawn\fP() and \fIposix_spawnp\fP() functions are considerably
+"heavier" than thread creation. Processes have several
+important attributes that threads do not. Even without address translation,
+a process may have base-and-bound memory protection.
+Each process has a process environment including security attributes
+and file capabilities, and powerful scheduling attributes.
+Processes abstract the behavior of non-uniform-memory-architecture
+multi-processors better than threads, and they are more
+convenient to use for activities that are not closely linked.
+.LP
+The \fIposix_spawn\fP() and \fIposix_spawnp\fP() functions may not
+bring support for multiple processes to every
+configuration. Process creation is not the only piece of operating
+system support required to support multiple processes. The total
+cost of support for multiple processes may be quite high in some circumstances.
+Existing practice shows that support for multiple
+processes is uncommon and threads are common among "tiny kernels".
+There should, therefore, probably continue to be AEPs for
+operating systems with only one process.
+.SS Asynchronous Error Notification
+.LP
+A library implementation of \fIposix_spawn\fP() or \fIposix_spawnp\fP()
+may not be able to detect all possible errors before
+it forks the child process. IEEE\ Std\ 1003.1-2001 provides for an
+error indication returned from a child process which
+could not successfully complete the spawn operation via a special
+exit status which may be detected using the status value returned
+by \fIwait\fP() and \fIwaitpid\fP().
+.LP
+The \fIstat_val\fP interface and the macros used to interpret it are
+not well suited to the purpose of returning API errors,
+but they are the only path available to a library implementation.
+Thus, an implementation may cause the child process to exit with
+exit status 127 for any error detected during the spawn process after
+the \fIposix_spawn\fP() or \fIposix_spawnp\fP() function
+has successfully returned.
+.LP
+The standard developers had proposed using two additional macros to
+interpret \fIstat_val\fP. The first, WIFSPAWNFAIL, would
+have detected a status that indicated that the child exited because
+of an error detected during the \fIposix_spawn\fP() or
+\fIposix_spawnp\fP() operations rather than during actual execution
+of the child process image; the second, WSPAWNERRNO, would
+have extracted the error value if WIFSPAWNFAIL indicated a failure.
+Unfortunately, the ballot group strongly opposed this because
+it would make a library implementation of \fIposix_spawn\fP() or \fIposix_spawnp\fP()
+dependent on kernel modifications to \fIwaitpid\fP() to be able to
+embed special information in \fIstat_val\fP to indicate a
+spawn failure.
+.LP
+The 8 bits of child process exit status that are guaranteed by IEEE\ Std\ 1003.1-2001
+to be accessible to the waiting
+parent process are insufficient to disambiguate a spawn error from
+any other kind of error that may be returned by an arbitrary
+process image. No other bits of the exit status are required to be
+visible in \fIstat_val\fP, so these macros could not be
+strictly implemented at the library level. Reserving an exit status
+of 127 for such spawn errors is consistent with the use of this
+value by \fIsystem\fP() and \fIpopen\fP() to signal
+failures in these operations that occur after the function has returned
+but before a shell is able to execute. The exit status of
+127 does not uniquely identify this class of error, nor does it provide
+any detailed information on the nature of the failure. Note
+that a kernel implementation of \fIposix_spawn\fP() or \fIposix_spawnp\fP()
+is permitted (and encouraged) to return any possible
+error as the function value, thus providing more detailed failure
+information to the parent process.
+.LP
+Thus, no special macros are available to isolate asynchronous \fIposix_spawn\fP()
+or \fIposix_spawnp\fP() errors. Instead,
+errors detected by the \fIposix_spawn\fP() or \fIposix_spawnp\fP()
+operations in the context of the child process before the new
+process image executes are reported by setting the child's exit status
+to 127. The calling process may use the WIFEXITED and
+WEXITSTATUS macros on the \fIstat_val\fP stored by the \fIwait\fP()
+or \fIwaitpid\fP() functions to detect spawn failures to the extent
+that other status values with
+which the child process image may exit (before the parent can conclusively
+determine that the child process image has begun
+execution) are distinct from exit status 127.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIalarm\fP(), \fIchmod\fP(), \fIclose\fP(), \fIdup\fP(), \fIexec\fP(),
+\fIexit\fP(), \fIfcntl\fP(), \fIfork\fP(), \fIkill\fP(), \fIopen\fP(),
+\fIposix_spawn_file_actions_addclose\fP(), \fIposix_spawn_file_actions_adddup2\fP(),
+\fIposix_spawn_file_actions_addopen\fP(), \fIposix_spawn_file_actions_destroy\fP(),
+\fIposix_spawnattr_destroy\fP(), \fIposix_spawnattr_init\fP(),
+\fIposix_spawnattr_getsigdefault\fP(), \fIposix_spawnattr_getflags\fP(),
+\fIposix_spawnattr_getpgroup\fP(), \fIposix_spawnattr_getschedparam\fP(),
+\fIposix_spawnattr_getschedpolicy\fP(), \fIposix_spawnattr_getsigmask\fP(),
+\fIposix_spawnattr_setsigdefault\fP(), \fIposix_spawnattr_setflags\fP(),
+\fIposix_spawnattr_setpgroup\fP(), \fIposix_spawnattr_setschedparam\fP(),
+\fIposix_spawnattr_setschedpolicy\fP(), \fIposix_spawnattr_setsigmask\fP(),
+\fIsched_setparam\fP(), \fIsched_setscheduler\fP(), \fIsetpgid\fP(),
+\fIsetuid\fP(), \fIstat\fP(), \fItimes\fP(), \fIwait\fP(), the
+Base Definitions volume of
+IEEE\ Std\ 1003.1-2001, \fI<spawn.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .