| @node Processes, Job Control, 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. |
| |
| @comment stdlib.h |
| @comment ISO |
| @deftypefun int system (const char *@var{command}) |
| @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 process ID |
| @cindex process lifetime |
| Each process is named by a @dfn{process ID} number. A unique process ID |
| is allocated to each process when it is created. The @dfn{lifetime} of |
| a process ends when its termination is reported to its parent process; |
| at that time, all of the process resources, including its process ID, |
| are freed. |
| |
| @cindex creating a process |
| @cindex forking a process |
| @cindex child process |
| @cindex parent process |
| Processes are created with the @code{fork} system call (so the operation |
| of creating a new process is sometimes called @dfn{forking} a process). |
| The @dfn{child process} created by @code{fork} is a copy of the original |
| @dfn{parent process}, except that it has its own process ID. |
| |
| 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 |
| |
| The @code{pid_t} data type represents process IDs. 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 |
| |
| @comment sys/types.h |
| @comment POSIX.1 |
| @deftp {Data Type} pid_t |
| 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 |
| |
| @comment unistd.h |
| @comment POSIX.1 |
| @deftypefun pid_t getpid (void) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| The @code{getpid} function returns the process ID of the current process. |
| @end deftypefun |
| |
| @comment unistd.h |
| @comment POSIX.1 |
| @deftypefun pid_t getppid (void) |
| @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 |
| |
| @comment unistd.h |
| @comment POSIX.1 |
| @deftypefun pid_t fork (void) |
| @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 |
| |
| |
| @comment unistd.h |
| @comment BSD |
| @deftypefun pid_t vfork (void) |
| @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}. |
| |
| @comment unistd.h |
| @comment POSIX.1 |
| @deftypefun int execv (const char *@var{filename}, char *const @var{argv}@t{[]}) |
| @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 |
| |
| @comment unistd.h |
| @comment POSIX.1 |
| @deftypefun int execl (const char *@var{filename}, const char *@var{arg0}, @dots{}) |
| @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 |
| |
| @comment unistd.h |
| @comment POSIX.1 |
| @deftypefun int execve (const char *@var{filename}, char *const @var{argv}@t{[]}, char *const @var{env}@t{[]}) |
| @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 |
| |
| @comment unistd.h |
| @comment POSIX.1 |
| @deftypefun int execle (const char *@var{filename}, const char *@var{arg0}, @dots{}, char *const @var{env}@t{[]}) |
| @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 |
| |
| @comment unistd.h |
| @comment POSIX.1 |
| @deftypefun int execvp (const char *@var{filename}, char *const @var{argv}@t{[]}) |
| @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 |
| |
| @comment unistd.h |
| @comment POSIX.1 |
| @deftypefun int execlp (const char *@var{filename}, const char *@var{arg0}, @dots{}) |
| @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 description 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 |
| |
| @comment sys/wait.h |
| @comment POSIX.1 |
| @deftypefun pid_t waitpid (pid_t @var{pid}, int *@var{status-ptr}, int @var{options}) |
| @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. |
| @table @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 table |
| |
| 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. |
| |
| @table @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 table |
| |
| @comment sys/wait.h |
| @comment POSIX.1 |
| @deftypefun pid_t wait (int *@var{status-ptr}) |
| @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 |
| |
| @comment sys/wait.h |
| @comment BSD |
| @deftypefun pid_t wait4 (pid_t @var{pid}, int *@var{status-ptr}, int @var{options}, struct rusage *@var{usage}) |
| @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 |
| |
| @comment sys/wait.h |
| @comment POSIX.1 |
| @deftypefn Macro int WIFEXITED (int @var{status}) |
| @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 |
| |
| @comment sys/wait.h |
| @comment POSIX.1 |
| @deftypefn Macro int WEXITSTATUS (int @var{status}) |
| @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 |
| |
| @comment sys/wait.h |
| @comment POSIX.1 |
| @deftypefn Macro int WIFSIGNALED (int @var{status}) |
| @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 |
| |
| @comment sys/wait.h |
| @comment POSIX.1 |
| @deftypefn Macro int WTERMSIG (int @var{status}) |
| @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 |
| |
| @comment sys/wait.h |
| @comment BSD |
| @deftypefn Macro int WCOREDUMP (int @var{status}) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| This macro returns a nonzero value if the child process terminated |
| and produced a core dump. |
| @end deftypefn |
| |
| @comment sys/wait.h |
| @comment POSIX.1 |
| @deftypefn Macro int WIFSTOPPED (int @var{status}) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| This macro returns a nonzero value if the child process is stopped. |
| @end deftypefn |
| |
| @comment sys/wait.h |
| @comment POSIX.1 |
| @deftypefn Macro int WSTOPSIG (int @var{status}) |
| @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 Functions |
| |
| @Theglibc{} also provides these related facilities for compatibility |
| with BSD Unix. BSD uses the @code{union wait} data type to represent |
| status values rather than an @code{int}. The two representations are |
| actually interchangeable; they describe the same bit patterns. @Theglibc{} |
| defines macros such as @code{WEXITSTATUS} so that they will |
| work on either kind of object, and the @code{wait} function is defined |
| to accept either type of pointer as its @var{status-ptr} argument. |
| |
| These functions are declared in @file{sys/wait.h}. |
| @pindex sys/wait.h |
| |
| @comment sys/wait.h |
| @comment BSD |
| @deftp {Data Type} {union wait} |
| This data type represents program termination status values. It has |
| the following members: |
| |
| @table @code |
| @item int w_termsig |
| The value of this member is the same as that of the |
| @code{WTERMSIG} macro. |
| |
| @item int w_coredump |
| The value of this member is the same as that of the |
| @code{WCOREDUMP} macro. |
| |
| @item int w_retcode |
| The value of this member is the same as that of the |
| @code{WEXITSTATUS} macro. |
| |
| @item int w_stopsig |
| The value of this member is the same as that of the |
| @code{WSTOPSIG} macro. |
| @end table |
| |
| Instead of accessing these members directly, you should use the |
| equivalent macros. |
| @end deftp |
| |
| The @code{wait3} function is the predecessor to @code{wait4}, which is |
| more flexible. @code{wait3} is now obsolete. |
| |
| @comment sys/wait.h |
| @comment BSD |
| @deftypefun pid_t wait3 (union wait *@var{status-ptr}, int @var{options}, struct rusage *@var{usage}) |
| @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}. |