wait

TriggerTek Logo
abcdefghijklmnopqrstuvwxyz_
WAIT(2)			  Linux Programmer’s Manual		      WAIT(2)



NAME
       wait, waitpid - wait for process termination

SYNOPSIS
       #include <sys/types.h>
       #include <sys/wait.h>

       pid_t wait(int *status);
       pid_t waitpid(pid_t pid, int *status, int options);

DESCRIPTION
       The  wait  function  suspends execution of the current process until a
       child has exited, or until a signal is delivered whose  action  is  to
       terminate  the  current process or to call a signal handling function.
       If a child has already exited by the time of  the  call	(a  so-called
       "zombie"	 process),  the	 function  returns  immediately.   Any system
       resources used by the child are freed.

       The waitpid function suspends execution of the current process until a
       child  as  specified by the pid argument has exited, or until a signal
       is delivered whose action is to terminate the current  process  or  to
       call  a	signal handling function.  If a child as requested by pid has
       already exited by the time of the call (a so-called "zombie" process),
       the  function  returns  immediately.  Any system resources used by the
       child are freed.

       The value of pid can be one of:

       < -1   which means to wait for any child process whose  process	group
	      ID is equal to the absolute value of pid.

       -1     which  means  to	wait  for any child process; this is the same
	      behaviour which wait exhibits.

       0      which means to wait for any child process whose  process	group
	      ID is equal to that of the calling process.

       > 0    which  means to wait for the child whose process ID is equal to
	      the value of pid.

       The value of options is an OR of zero or more of	 the  following	 con-
       stants:

       WNOHANG
	      which means to return immediately if no child has exited.

       WUNTRACED
	      which  means to also return for children which are stopped (but
	      not traced), and whose status has not  been  reported.   Status
	      for  traced children which are stopped is provided also without
	      this option.

       (For Linux-only options, see below.)

       If status is not NULL, wait or waitpid store status information in the
       location pointed to by status.

       This  status  can be evaluated with the following macros (these macros
       take the stat buffer (an int) as an argument — not a  pointer  to  the
       buffer!):

       WIFEXITED(status)
	      returns  true  if	 the  child  terminated normally, that is, by
	      calling exit() or _exit(), or by returning from main().

       WEXITSTATUS(status)
	      evaluates to the least significant eight	bits  of  the  return
	      code  of the child which terminated, which may have been set as
	      the argument to a call to exit() or _exit() or as the  argument
	      for  a  return  statement	 in the main program.  This macro can
	      only be evaluated if WIFEXITED returned true.

       WIFSIGNALED(status)
	      returns true if the child process terminated because of a	 sig-
	      nal which was not caught.

       WTERMSIG(status)
	      returns  the number of the signal that caused the child process
	      to terminate. This macro can only be evaluated  if  WIFSIGNALED
	      returned non-zero.

       WIFSTOPPED(status)
	      returns  true  if	 the child process which caused the return is
	      currently stopped; this is only possible if the call  was	 done
	      using  WUNTRACED	or  when  the  child  is  being	 traced	 (see
	      ptrace(2)).

       WSTOPSIG(status)
	      returns the number of the signal	which  caused  the  child  to
	      stop.   This macro can only be evaluated if WIFSTOPPED returned
	      non-zero.

       Some versions of Unix (e.g. Linux, Solaris, but not AIX,	 SunOS)	 also
       define  a  macro	 WCOREDUMP(status)  to test whether the child process
       dumped core. Only use this enclosed in #ifdef WCOREDUMP ... #endif.

RETURN VALUE
       The process ID of the child which exited, or zero if WNOHANG was	 used
       and no child was available, or -1 on error (in which case errno is set
       to an appropriate value).

ERRORS
       ECHILD if the process specified in pid does not	exist  or  is  not  a
	      child  of	 the calling process.  (This can happen for one’s own
	      child if the action for SIGCHLD is set to SIG_IGN. See also the
	      LINUX NOTES section about threads.)

       EINVAL if the options argument was invalid.

       EINTR  if WNOHANG was not set and an unblocked signal or a SIGCHLD was
	      caught.

NOTES
       The Single Unix Specification describes a flag SA_NOCLDWAIT (not	 sup-
       ported  under  Linux)  such  that  if  either this flag is set, or the
       action for SIGCHLD is set to SIG_IGN then children that	exit  do  not
       become  zombies and a call to wait() or waitpid() will block until all
       children have exited, and then fail with errno set to ECHILD.

       The original POSIX standard left the behaviour of setting  SIGCHLD  to
       SIG_IGN	unspecified.   Later  standards,  including  SUSv2  and POSIX
       1003.1-2001 specify the behaviour just described as an  XSI-compliance
       option.	 Linux	does not conform to the second of the two points just
       described: if a wait() or waitpid() call	 is  made  while  SIGCHLD  is
       being  ignored, the call behaves just as though SIGCHLD were not being
       ignored, that is, the call blocks until the next child terminates  and
       then returns the PID and status of that child.

LINUX NOTES
       In  the Linux kernel, a kernel-scheduled thread is not a distinct con-
       struct from a process. Instead, a thread is simply a process  that  is
       created	using  the  Linux-unique clone(2) system call; other routines
       such as the portable  pthread_create(3)	call  are  implemented	using
       clone(2).   Before  Linux  2.4,	a thread was just a special case of a
       process, and as a consequence one thread could not wait on  the	chil-
       dren  of	 another  thread,  even	 when  the latter belongs to the same
       thread group.  However, POSIX prescribes such functionality, and since
       Linux 2.4 a thread can, and by default will, wait on children of other
       threads in the same thread group.

       The following Linux-specific options are for use with children created
       using clone(2).

       __WCLONE
	      Wait for "clone" children only.  If omitted then wait for "non-
	      clone" children only.  (A "clone" child is one  which  delivers
	      no  signal,  or  a signal other than SIGCHLD to its parent upon
	      termination.)  This option is ignored if __WALL is also  speci-
	      fied.

       __WALL (Since  Linux  2.4)  Wait	 for all children, regardless of type
	      ("clone" or "non-clone").

       __WNOTHREAD
	      (Since Linux 2.4) Do not wait for children of other threads  in
	      the same thread group. This was the default before Linux 2.4.

CONFORMING TO
       SVr4, POSIX.1

SEE ALSO
       clone(2), ptrace(2), signal(2), wait4(2), pthread_create(3), signal(7)



Linux				  2000-07-24			      WAIT(2)