123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854 |
- @node Processes, Inter-Process Communication, Program Basics, Top
- @c %MENU% How to create processes and run other programs
- @chapter Processes
- @cindex process
- @dfn{Processes} are the primitive units for allocation of system
- resources. Each process has its own address space and (usually) one
- thread of control. A process executes a program; you can have multiple
- processes executing the same program, but each process has its own copy
- of the program within its own address space and executes it
- independently of the other copies.
- @cindex child process
- @cindex parent process
- Processes are organized hierarchically. Each process has a @dfn{parent
- process} which explicitly arranged to create it. The processes created
- by a given parent are called its @dfn{child processes}. A child
- inherits many of its attributes from the parent process.
- This chapter describes how a program can create, terminate, and control
- child processes. Actually, there are three distinct operations
- involved: creating a new child process, causing the new process to
- execute a program, and coordinating the completion of the child process
- with the original program.
- The @code{system} function provides a simple, portable mechanism for
- running another program; it does all three steps automatically. If you
- need more control over the details of how this is done, you can use the
- primitive functions to do each step individually instead.
- @menu
- * Running a Command:: The easy way to run another program.
- * Process Creation Concepts:: An overview of the hard way to do it.
- * Process Identification:: How to get the process ID of a process.
- * Creating a Process:: How to fork a child process.
- * Executing a File:: How to make a process execute another program.
- * Process Completion:: How to tell when a child process has completed.
- * Process Completion Status:: How to interpret the status value
- returned from a child process.
- * BSD Wait Functions:: More functions, for backward compatibility.
- * Process Creation Example:: A complete example program.
- @end menu
- @node Running a Command
- @section Running a Command
- @cindex running a command
- The easy way to run another program is to use the @code{system}
- function. This function does all the work of running a subprogram, but
- it doesn't give you much control over the details: you have to wait
- until the subprogram terminates before you can do anything else.
- @deftypefun int system (const char *@var{command})
- @standards{ISO, stdlib.h}
- @pindex sh
- @safety{@prelim{}@mtsafe{}@asunsafe{@ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{}}}
- @c system @ascuplugin @ascuheap @asulock @aculock @acsmem
- @c do_system @ascuplugin @ascuheap @asulock @aculock @acsmem
- @c sigemptyset dup ok
- @c libc_lock_lock @asulock @aculock
- @c ADD_REF ok
- @c sigaction dup ok
- @c SUB_REF ok
- @c libc_lock_unlock @aculock
- @c sigaddset dup ok
- @c sigprocmask dup ok
- @c CLEANUP_HANDLER @ascuplugin @ascuheap @acsmem
- @c libc_cleanup_region_start @ascuplugin @ascuheap @acsmem
- @c pthread_cleanup_push_defer @ascuplugin @ascuheap @acsmem
- @c CANCELLATION_P @ascuplugin @ascuheap @acsmem
- @c CANCEL_ENABLED_AND_CANCELED ok
- @c do_cancel @ascuplugin @ascuheap @acsmem
- @c cancel_handler ok
- @c kill syscall ok
- @c waitpid dup ok
- @c libc_lock_lock ok
- @c sigaction dup ok
- @c libc_lock_unlock ok
- @c FORK ok
- @c clone syscall ok
- @c waitpid dup ok
- @c CLEANUP_RESET ok
- @c libc_cleanup_region_end ok
- @c pthread_cleanup_pop_restore ok
- @c SINGLE_THREAD_P ok
- @c LIBC_CANCEL_ASYNC @ascuplugin @ascuheap @acsmem
- @c libc_enable_asynccancel @ascuplugin @ascuheap @acsmem
- @c CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS dup ok
- @c do_cancel dup @ascuplugin @ascuheap @acsmem
- @c LIBC_CANCEL_RESET ok
- @c libc_disable_asynccancel ok
- @c lll_futex_wait dup ok
- This function executes @var{command} as a shell command. In @theglibc{},
- it always uses the default shell @code{sh} to run the command.
- In particular, it searches the directories in @code{PATH} to find
- programs to execute. The return value is @code{-1} if it wasn't
- possible to create the shell process, and otherwise is the status of the
- shell process. @xref{Process Completion}, for details on how this
- status code can be interpreted.
- If the @var{command} argument is a null pointer, a return value of zero
- indicates that no command processor is available.
- This function is a cancellation point in multi-threaded programs. This
- is a problem if the thread allocates some resources (like memory, file
- descriptors, semaphores or whatever) at the time @code{system} is
- called. If the thread gets canceled these resources stay allocated
- until the program ends. To avoid this calls to @code{system} should be
- protected using cancellation handlers.
- @c ref pthread_cleanup_push / pthread_cleanup_pop
- @pindex stdlib.h
- The @code{system} function is declared in the header file
- @file{stdlib.h}.
- @end deftypefun
- @strong{Portability Note:} Some C implementations may not have any
- notion of a command processor that can execute other programs. You can
- determine whether a command processor exists by executing
- @w{@code{system (NULL)}}; if the return value is nonzero, a command
- processor is available.
- The @code{popen} and @code{pclose} functions (@pxref{Pipe to a
- Subprocess}) are closely related to the @code{system} function. They
- allow the parent process to communicate with the standard input and
- output channels of the command being executed.
- @node Process Creation Concepts
- @section Process Creation Concepts
- This section gives an overview of processes and of the steps involved in
- creating a process and making it run another program.
- @cindex creating a process
- @cindex forking a process
- @cindex child process
- @cindex parent process
- @cindex subprocess
- A new processes is created when one of the functions
- @code{posix_spawn}, @code{fork}, or @code{vfork} is called. (The
- @code{system} and @code{popen} also create new processes internally.)
- Due to the name of the @code{fork} function, the act of creating a new
- process is sometimes called @dfn{forking} a process. Each new process
- (the @dfn{child process} or @dfn{subprocess}) is allocated a process
- ID, distinct from the process ID of the parent process. @xref{Process
- Identification}.
- After forking a child process, both the parent and child processes
- continue to execute normally. If you want your program to wait for a
- child process to finish executing before continuing, you must do this
- explicitly after the fork operation, by calling @code{wait} or
- @code{waitpid} (@pxref{Process Completion}). These functions give you
- limited information about why the child terminated---for example, its
- exit status code.
- A newly forked child process continues to execute the same program as
- its parent process, at the point where the @code{fork} call returns.
- You can use the return value from @code{fork} to tell whether the program
- is running in the parent process or the child.
- @cindex process image
- Having several processes run the same program is only occasionally
- useful. But the child can execute another program using one of the
- @code{exec} functions; see @ref{Executing a File}. The program that the
- process is executing is called its @dfn{process image}. Starting
- execution of a new program causes the process to forget all about its
- previous process image; when the new program exits, the process exits
- too, instead of returning to the previous process image.
- @node Process Identification
- @section Process Identification
- @cindex process ID
- Each process is named by a @dfn{process ID} number, a value of type
- @code{pid_t}. A process ID is allocated to each process when it is
- created. Process IDs are reused over time. The lifetime of a process
- ends when the parent process of the corresponding process waits on the
- process ID after the process has terminated. @xref{Process
- Completion}. (The parent process can arrange for such waiting to
- happen implicitly.) A process ID uniquely identifies a process only
- during the lifetime of the process. As a rule of thumb, this means
- that the process must still be running.
- Process IDs can also denote process groups and sessions.
- @xref{Job Control}.
- @cindex thread ID
- @cindex task ID
- @cindex thread group
- On Linux, threads created by @code{pthread_create} also receive a
- @dfn{thread ID}. The thread ID of the initial (main) thread is the
- same as the process ID of the entire process. Thread IDs for
- subsequently created threads are distinct. They are allocated from
- the same numbering space as process IDs. Process IDs and thread IDs
- are sometimes also referred to collectively as @dfn{task IDs}. In
- contrast to processes, threads are never waited for explicitly, so a
- thread ID becomes eligible for reuse as soon as a thread exits or is
- canceled. This is true even for joinable threads, not just detached
- threads. Threads are assigned to a @dfn{thread group}. In
- @theglibc{} implementation running on Linux, the process ID is the
- thread group ID of all threads in the process.
- You can get the process ID of a process by calling @code{getpid}. The
- function @code{getppid} returns the process ID of the parent of the
- current process (this is also known as the @dfn{parent process ID}).
- Your program should include the header files @file{unistd.h} and
- @file{sys/types.h} to use these functions.
- @pindex sys/types.h
- @pindex unistd.h
- @deftp {Data Type} pid_t
- @standards{POSIX.1, sys/types.h}
- The @code{pid_t} data type is a signed integer type which is capable
- of representing a process ID. In @theglibc{}, this is an @code{int}.
- @end deftp
- @deftypefun pid_t getpid (void)
- @standards{POSIX.1, unistd.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- The @code{getpid} function returns the process ID of the current process.
- @end deftypefun
- @deftypefun pid_t getppid (void)
- @standards{POSIX.1, unistd.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- The @code{getppid} function returns the process ID of the parent of the
- current process.
- @end deftypefun
- @node Creating a Process
- @section Creating a Process
- The @code{fork} function is the primitive for creating a process.
- It is declared in the header file @file{unistd.h}.
- @pindex unistd.h
- @deftypefun pid_t fork (void)
- @standards{POSIX.1, unistd.h}
- @safety{@prelim{}@mtsafe{}@asunsafe{@ascuplugin{}}@acunsafe{@aculock{}}}
- @c The nptl/.../linux implementation safely collects fork_handlers into
- @c an alloca()ed linked list and increments ref counters; it uses atomic
- @c ops and retries, avoiding locking altogether. It then takes the
- @c IO_list lock, resets the thread-local pid, and runs fork. The parent
- @c restores the thread-local pid, releases the lock, and runs parent
- @c handlers, decrementing the ref count and signaling futex wait if
- @c requested by unregister_atfork. The child bumps the fork generation,
- @c sets the thread-local pid, resets cpu clocks, initializes the robust
- @c mutex list, the stream locks, the IO_list lock, the dynamic loader
- @c lock, runs the child handlers, reseting ref counters to 1, and
- @c initializes the fork lock. These are all safe, unless atfork
- @c handlers themselves are unsafe.
- The @code{fork} function creates a new process.
- If the operation is successful, there are then both parent and child
- processes and both see @code{fork} return, but with different values: it
- returns a value of @code{0} in the child process and returns the child's
- process ID in the parent process.
- If process creation failed, @code{fork} returns a value of @code{-1} in
- the parent process. The following @code{errno} error conditions are
- defined for @code{fork}:
- @table @code
- @item EAGAIN
- There aren't enough system resources to create another process, or the
- user already has too many processes running. This means exceeding the
- @code{RLIMIT_NPROC} resource limit, which can usually be increased;
- @pxref{Limits on Resources}.
- @item ENOMEM
- The process requires more space than the system can supply.
- @end table
- @end deftypefun
- The specific attributes of the child process that differ from the
- parent process are:
- @itemize @bullet
- @item
- The child process has its own unique process ID.
- @item
- The parent process ID of the child process is the process ID of its
- parent process.
- @item
- The child process gets its own copies of the parent process's open file
- descriptors. Subsequently changing attributes of the file descriptors
- in the parent process won't affect the file descriptors in the child,
- and vice versa. @xref{Control Operations}. However, the file position
- associated with each descriptor is shared by both processes;
- @pxref{File Position}.
- @item
- The elapsed processor times for the child process are set to zero;
- see @ref{Processor Time}.
- @item
- The child doesn't inherit file locks set by the parent process.
- @c !!! flock locks shared
- @xref{Control Operations}.
- @item
- The child doesn't inherit alarms set by the parent process.
- @xref{Setting an Alarm}.
- @item
- The set of pending signals (@pxref{Delivery of Signal}) for the child
- process is cleared. (The child process inherits its mask of blocked
- signals and signal actions from the parent process.)
- @end itemize
- @deftypefun pid_t vfork (void)
- @standards{BSD, unistd.h}
- @safety{@prelim{}@mtsafe{}@asunsafe{@ascuplugin{}}@acunsafe{@aculock{}}}
- @c The vfork implementation proper is a safe syscall, but it may fall
- @c back to fork if the vfork syscall is not available.
- The @code{vfork} function is similar to @code{fork} but on some systems
- it is more efficient; however, there are restrictions you must follow to
- use it safely.
- While @code{fork} makes a complete copy of the calling process's address
- space and allows both the parent and child to execute independently,
- @code{vfork} does not make this copy. Instead, the child process
- created with @code{vfork} shares its parent's address space until it
- calls @code{_exit} or one of the @code{exec} functions. In the
- meantime, the parent process suspends execution.
- You must be very careful not to allow the child process created with
- @code{vfork} to modify any global data or even local variables shared
- with the parent. Furthermore, the child process cannot return from (or
- do a long jump out of) the function that called @code{vfork}! This
- would leave the parent process's control information very confused. If
- in doubt, use @code{fork} instead.
- Some operating systems don't really implement @code{vfork}. @Theglibc{}
- permits you to use @code{vfork} on all systems, but actually
- executes @code{fork} if @code{vfork} isn't available. If you follow
- the proper precautions for using @code{vfork}, your program will still
- work even if the system uses @code{fork} instead.
- @end deftypefun
- @node Executing a File
- @section Executing a File
- @cindex executing a file
- @cindex @code{exec} functions
- This section describes the @code{exec} family of functions, for executing
- a file as a process image. You can use these functions to make a child
- process execute a new program after it has been forked.
- To see the effects of @code{exec} from the point of view of the called
- program, see @ref{Program Basics}.
- @pindex unistd.h
- The functions in this family differ in how you specify the arguments,
- but otherwise they all do the same thing. They are declared in the
- header file @file{unistd.h}.
- @deftypefun int execv (const char *@var{filename}, char *const @var{argv}@t{[]})
- @standards{POSIX.1, unistd.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- The @code{execv} function executes the file named by @var{filename} as a
- new process image.
- The @var{argv} argument is an array of null-terminated strings that is
- used to provide a value for the @code{argv} argument to the @code{main}
- function of the program to be executed. The last element of this array
- must be a null pointer. By convention, the first element of this array
- is the file name of the program sans directory names. @xref{Program
- Arguments}, for full details on how programs can access these arguments.
- The environment for the new process image is taken from the
- @code{environ} variable of the current process image; see
- @ref{Environment Variables}, for information about environments.
- @end deftypefun
- @deftypefun int execl (const char *@var{filename}, const char *@var{arg0}, @dots{})
- @standards{POSIX.1, unistd.h}
- @safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
- This is similar to @code{execv}, but the @var{argv} strings are
- specified individually instead of as an array. A null pointer must be
- passed as the last such argument.
- @end deftypefun
- @deftypefun int execve (const char *@var{filename}, char *const @var{argv}@t{[]}, char *const @var{env}@t{[]})
- @standards{POSIX.1, unistd.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- This is similar to @code{execv}, but permits you to specify the environment
- for the new program explicitly as the @var{env} argument. This should
- be an array of strings in the same format as for the @code{environ}
- variable; see @ref{Environment Access}.
- @end deftypefun
- @deftypefun int execle (const char *@var{filename}, const char *@var{arg0}, @dots{}, char *const @var{env}@t{[]})
- @standards{POSIX.1, unistd.h}
- @safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
- This is similar to @code{execl}, but permits you to specify the
- environment for the new program explicitly. The environment argument is
- passed following the null pointer that marks the last @var{argv}
- argument, and should be an array of strings in the same format as for
- the @code{environ} variable.
- @end deftypefun
- @deftypefun int execvp (const char *@var{filename}, char *const @var{argv}@t{[]})
- @standards{POSIX.1, unistd.h}
- @safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
- The @code{execvp} function is similar to @code{execv}, except that it
- searches the directories listed in the @code{PATH} environment variable
- (@pxref{Standard Environment}) to find the full file name of a
- file from @var{filename} if @var{filename} does not contain a slash.
- This function is useful for executing system utility programs, because
- it looks for them in the places that the user has chosen. Shells use it
- to run the commands that users type.
- @end deftypefun
- @deftypefun int execlp (const char *@var{filename}, const char *@var{arg0}, @dots{})
- @standards{POSIX.1, unistd.h}
- @safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
- This function is like @code{execl}, except that it performs the same
- file name searching as the @code{execvp} function.
- @end deftypefun
- The size of the argument list and environment list taken together must
- not be greater than @code{ARG_MAX} bytes. @xref{General Limits}. On
- @gnuhurdsystems{}, the size (which compares against @code{ARG_MAX})
- includes, for each string, the number of characters in the string, plus
- the size of a @code{char *}, plus one, rounded up to a multiple of the
- size of a @code{char *}. Other systems may have somewhat different
- rules for counting.
- These functions normally don't return, since execution of a new program
- causes the currently executing program to go away completely. A value
- of @code{-1} is returned in the event of a failure. In addition to the
- usual file name errors (@pxref{File Name Errors}), the following
- @code{errno} error conditions are defined for these functions:
- @table @code
- @item E2BIG
- The combined size of the new program's argument list and environment
- list is larger than @code{ARG_MAX} bytes. @gnuhurdsystems{} have no
- specific limit on the argument list size, so this error code cannot
- result, but you may get @code{ENOMEM} instead if the arguments are too
- big for available memory.
- @item ENOEXEC
- The specified file can't be executed because it isn't in the right format.
- @item ENOMEM
- Executing the specified file requires more storage than is available.
- @end table
- If execution of the new file succeeds, it updates the access time field
- of the file as if the file had been read. @xref{File Times}, for more
- details about access times of files.
- The point at which the file is closed again is not specified, but
- is at some point before the process exits or before another process
- image is executed.
- Executing a new process image completely changes the contents of memory,
- copying only the argument and environment strings to new locations. But
- many other attributes of the process are unchanged:
- @itemize @bullet
- @item
- The process ID and the parent process ID. @xref{Process Creation Concepts}.
- @item
- Session and process group membership. @xref{Concepts of Job Control}.
- @item
- Real user ID and group ID, and supplementary group IDs. @xref{Process
- Persona}.
- @item
- Pending alarms. @xref{Setting an Alarm}.
- @item
- Current working directory and root directory. @xref{Working
- Directory}. On @gnuhurdsystems{}, the root directory is not copied when
- executing a setuid program; instead the system default root directory
- is used for the new program.
- @item
- File mode creation mask. @xref{Setting Permissions}.
- @item
- Process signal mask; see @ref{Process Signal Mask}.
- @item
- Pending signals; see @ref{Blocking Signals}.
- @item
- Elapsed processor time associated with the process; see @ref{Processor Time}.
- @end itemize
- If the set-user-ID and set-group-ID mode bits of the process image file
- are set, this affects the effective user ID and effective group ID
- (respectively) of the process. These concepts are discussed in detail
- in @ref{Process Persona}.
- Signals that are set to be ignored in the existing process image are
- also set to be ignored in the new process image. All other signals are
- set to the default action in the new process image. For more
- information about signals, see @ref{Signal Handling}.
- File descriptors open in the existing process image remain open in the
- new process image, unless they have the @code{FD_CLOEXEC}
- (close-on-exec) flag set. The files that remain open inherit all
- attributes of the open file descriptors from the existing process image,
- including file locks. File descriptors are discussed in @ref{Low-Level I/O}.
- Streams, by contrast, cannot survive through @code{exec} functions,
- because they are located in the memory of the process itself. The new
- process image has no streams except those it creates afresh. Each of
- the streams in the pre-@code{exec} process image has a descriptor inside
- it, and these descriptors do survive through @code{exec} (provided that
- they do not have @code{FD_CLOEXEC} set). The new process image can
- reconnect these to new streams using @code{fdopen} (@pxref{Descriptors
- and Streams}).
- @node Process Completion
- @section Process Completion
- @cindex process completion
- @cindex waiting for completion of child process
- @cindex testing exit status of child process
- The functions described in this section are used to wait for a child
- process to terminate or stop, and determine its status. These functions
- are declared in the header file @file{sys/wait.h}.
- @pindex sys/wait.h
- @deftypefun pid_t waitpid (pid_t @var{pid}, int *@var{status-ptr}, int @var{options})
- @standards{POSIX.1, sys/wait.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- The @code{waitpid} function is used to request status information from a
- child process whose process ID is @var{pid}. Normally, the calling
- process is suspended until the child process makes status information
- available by terminating.
- Other values for the @var{pid} argument have special interpretations. A
- value of @code{-1} or @code{WAIT_ANY} requests status information for
- any child process; a value of @code{0} or @code{WAIT_MYPGRP} requests
- information for any child process in the same process group as the
- calling process; and any other negative value @minus{} @var{pgid}
- requests information for any child process whose process group ID is
- @var{pgid}.
- If status information for a child process is available immediately, this
- function returns immediately without waiting. If more than one eligible
- child process has status information available, one of them is chosen
- randomly, and its status is returned immediately. To get the status
- from the other eligible child processes, you need to call @code{waitpid}
- again.
- The @var{options} argument is a bit mask. Its value should be the
- bitwise OR (that is, the @samp{|} operator) of zero or more of the
- @code{WNOHANG} and @code{WUNTRACED} flags. You can use the
- @code{WNOHANG} flag to indicate that the parent process shouldn't wait;
- and the @code{WUNTRACED} flag to request status information from stopped
- processes as well as processes that have terminated.
- The status information from the child process is stored in the object
- that @var{status-ptr} points to, unless @var{status-ptr} is a null pointer.
- This function is a cancellation point in multi-threaded programs. This
- is a problem if the thread allocates some resources (like memory, file
- descriptors, semaphores or whatever) at the time @code{waitpid} is
- called. If the thread gets canceled these resources stay allocated
- until the program ends. To avoid this calls to @code{waitpid} should be
- protected using cancellation handlers.
- @c ref pthread_cleanup_push / pthread_cleanup_pop
- The return value is normally the process ID of the child process whose
- status is reported. If there are child processes but none of them is
- waiting to be noticed, @code{waitpid} will block until one is. However,
- if the @code{WNOHANG} option was specified, @code{waitpid} will return
- zero instead of blocking.
- If a specific PID to wait for was given to @code{waitpid}, it will
- ignore all other children (if any). Therefore if there are children
- waiting to be noticed but the child whose PID was specified is not one
- of them, @code{waitpid} will block or return zero as described above.
- A value of @code{-1} is returned in case of error. The following
- @code{errno} error conditions are defined for this function:
- @table @code
- @item EINTR
- The function was interrupted by delivery of a signal to the calling
- process. @xref{Interrupted Primitives}.
- @item ECHILD
- There are no child processes to wait for, or the specified @var{pid}
- is not a child of the calling process.
- @item EINVAL
- An invalid value was provided for the @var{options} argument.
- @end table
- @end deftypefun
- These symbolic constants are defined as values for the @var{pid} argument
- to the @code{waitpid} function.
- @comment Extra blank lines make it look better.
- @vtable @code
- @item WAIT_ANY
- This constant macro (whose value is @code{-1}) specifies that
- @code{waitpid} should return status information about any child process.
- @item WAIT_MYPGRP
- This constant (with value @code{0}) specifies that @code{waitpid} should
- return status information about any child process in the same process
- group as the calling process.
- @end vtable
- These symbolic constants are defined as flags for the @var{options}
- argument to the @code{waitpid} function. You can bitwise-OR the flags
- together to obtain a value to use as the argument.
- @vtable @code
- @item WNOHANG
- This flag specifies that @code{waitpid} should return immediately
- instead of waiting, if there is no child process ready to be noticed.
- @item WUNTRACED
- This flag specifies that @code{waitpid} should report the status of any
- child processes that have been stopped as well as those that have
- terminated.
- @end vtable
- @deftypefun pid_t wait (int *@var{status-ptr})
- @standards{POSIX.1, sys/wait.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- This is a simplified version of @code{waitpid}, and is used to wait
- until any one child process terminates. The call:
- @smallexample
- wait (&status)
- @end smallexample
- @noindent
- is exactly equivalent to:
- @smallexample
- waitpid (-1, &status, 0)
- @end smallexample
- This function is a cancellation point in multi-threaded programs. This
- is a problem if the thread allocates some resources (like memory, file
- descriptors, semaphores or whatever) at the time @code{wait} is
- called. If the thread gets canceled these resources stay allocated
- until the program ends. To avoid this calls to @code{wait} should be
- protected using cancellation handlers.
- @c ref pthread_cleanup_push / pthread_cleanup_pop
- @end deftypefun
- @deftypefun pid_t wait4 (pid_t @var{pid}, int *@var{status-ptr}, int @var{options}, struct rusage *@var{usage})
- @standards{BSD, sys/wait.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- If @var{usage} is a null pointer, @code{wait4} is equivalent to
- @code{waitpid (@var{pid}, @var{status-ptr}, @var{options})}.
- If @var{usage} is not null, @code{wait4} stores usage figures for the
- child process in @code{*@var{rusage}} (but only if the child has
- terminated, not if it has stopped). @xref{Resource Usage}.
- This function is a BSD extension.
- @end deftypefun
- Here's an example of how to use @code{waitpid} to get the status from
- all child processes that have terminated, without ever waiting. This
- function is designed to be a handler for @code{SIGCHLD}, the signal that
- indicates that at least one child process has terminated.
- @smallexample
- @group
- void
- sigchld_handler (int signum)
- @{
- int pid, status, serrno;
- serrno = errno;
- while (1)
- @{
- pid = waitpid (WAIT_ANY, &status, WNOHANG);
- if (pid < 0)
- @{
- perror ("waitpid");
- break;
- @}
- if (pid == 0)
- break;
- notice_termination (pid, status);
- @}
- errno = serrno;
- @}
- @end group
- @end smallexample
- @node Process Completion Status
- @section Process Completion Status
- If the exit status value (@pxref{Program Termination}) of the child
- process is zero, then the status value reported by @code{waitpid} or
- @code{wait} is also zero. You can test for other kinds of information
- encoded in the returned status value using the following macros.
- These macros are defined in the header file @file{sys/wait.h}.
- @pindex sys/wait.h
- @deftypefn Macro int WIFEXITED (int @var{status})
- @standards{POSIX.1, sys/wait.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- This macro returns a nonzero value if the child process terminated
- normally with @code{exit} or @code{_exit}.
- @end deftypefn
- @deftypefn Macro int WEXITSTATUS (int @var{status})
- @standards{POSIX.1, sys/wait.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- If @code{WIFEXITED} is true of @var{status}, this macro returns the
- low-order 8 bits of the exit status value from the child process.
- @xref{Exit Status}.
- @end deftypefn
- @deftypefn Macro int WIFSIGNALED (int @var{status})
- @standards{POSIX.1, sys/wait.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- This macro returns a nonzero value if the child process terminated
- because it received a signal that was not handled.
- @xref{Signal Handling}.
- @end deftypefn
- @deftypefn Macro int WTERMSIG (int @var{status})
- @standards{POSIX.1, sys/wait.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- If @code{WIFSIGNALED} is true of @var{status}, this macro returns the
- signal number of the signal that terminated the child process.
- @end deftypefn
- @deftypefn Macro int WCOREDUMP (int @var{status})
- @standards{BSD, sys/wait.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- This macro returns a nonzero value if the child process terminated
- and produced a core dump.
- @end deftypefn
- @deftypefn Macro int WIFSTOPPED (int @var{status})
- @standards{POSIX.1, sys/wait.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- This macro returns a nonzero value if the child process is stopped.
- @end deftypefn
- @deftypefn Macro int WSTOPSIG (int @var{status})
- @standards{POSIX.1, sys/wait.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- If @code{WIFSTOPPED} is true of @var{status}, this macro returns the
- signal number of the signal that caused the child process to stop.
- @end deftypefn
- @node BSD Wait Functions
- @section BSD Process Wait Function
- @Theglibc{} also provides the @code{wait3} function for compatibility
- with BSD. This function is declared in @file{sys/wait.h}. It is the
- predecessor to @code{wait4}, which is more flexible. @code{wait3} is
- now obsolete.
- @pindex sys/wait.h
- @deftypefun pid_t wait3 (int *@var{status-ptr}, int @var{options}, struct rusage *@var{usage})
- @standards{BSD, sys/wait.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- If @var{usage} is a null pointer, @code{wait3} is equivalent to
- @code{waitpid (-1, @var{status-ptr}, @var{options})}.
- If @var{usage} is not null, @code{wait3} stores usage figures for the
- child process in @code{*@var{rusage}} (but only if the child has
- terminated, not if it has stopped). @xref{Resource Usage}.
- @end deftypefun
- @node Process Creation Example
- @section Process Creation Example
- Here is an example program showing how you might write a function
- similar to the built-in @code{system}. It executes its @var{command}
- argument using the equivalent of @samp{sh -c @var{command}}.
- @smallexample
- #include <stddef.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- /* @r{Execute the command using this shell program.} */
- #define SHELL "/bin/sh"
- @group
- int
- my_system (const char *command)
- @{
- int status;
- pid_t pid;
- @end group
- pid = fork ();
- if (pid == 0)
- @{
- /* @r{This is the child process. Execute the shell command.} */
- execl (SHELL, SHELL, "-c", command, NULL);
- _exit (EXIT_FAILURE);
- @}
- else if (pid < 0)
- /* @r{The fork failed. Report failure.} */
- status = -1;
- else
- /* @r{This is the parent process. Wait for the child to complete.} */
- if (waitpid (pid, &status, 0) != pid)
- status = -1;
- return status;
- @}
- @end smallexample
- @comment Yes, this example has been tested.
- There are a couple of things you should pay attention to in this
- example.
- Remember that the first @code{argv} argument supplied to the program
- represents the name of the program being executed. That is why, in the
- call to @code{execl}, @code{SHELL} is supplied once to name the program
- to execute and a second time to supply a value for @code{argv[0]}.
- The @code{execl} call in the child process doesn't return if it is
- successful. If it fails, you must do something to make the child
- process terminate. Just returning a bad status code with @code{return}
- would leave two processes running the original program. Instead, the
- right behavior is for the child process to report failure to its parent
- process.
- Call @code{_exit} to accomplish this. The reason for using @code{_exit}
- instead of @code{exit} is to avoid flushing fully buffered streams such
- as @code{stdout}. The buffers of these streams probably contain data
- that was copied from the parent process by the @code{fork}, data that
- will be output eventually by the parent process. Calling @code{exit} in
- the child would output the data twice. @xref{Termination Internals}.
|