mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	This patch adds a new "Inter-Process Communication" chapter to cover the sem*, msg*, and shm* functions. Initially we document only the sem* function signatures and their safety notes.
		
			
				
	
	
		
			888 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			888 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| @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.
 | |
| 
 | |
| @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}.
 |