]> git.ipfire.org Git - thirdparty/man-pages.git/blame - man2/wait.2
ldd.1, localedef.1, add_key.2, chroot.2, clone.2, fork.2, futex.2, get_mempolicy...
[thirdparty/man-pages.git] / man2 / wait.2
CommitLineData
1130df60 1.\" Copyright (c) 1993 by Thomas Koenig <ig25@rz.uni-karlsruhe.de>
c11b1abf 2.\" and Copyright (c) 2004 by Michael Kerrisk <mtk.manpages@gmail.com>
fea681da 3.\"
93015253 4.\" %%%LICENSE_START(VERBATIM)
fea681da
MK
5.\" Permission is granted to make and distribute verbatim copies of this
6.\" manual provided the copyright notice and this permission notice are
7.\" preserved on all copies.
8.\"
9.\" Permission is granted to copy and distribute modified versions of this
10.\" manual under the conditions for verbatim copying, provided that the
11.\" entire resulting derived work is distributed under the terms of a
12.\" permission notice identical to this one.
c13182ef 13.\"
fea681da
MK
14.\" Since the Linux kernel and libraries are constantly changing, this
15.\" manual page may be incorrect or out-of-date. The author(s) assume no
16.\" responsibility for errors or omissions, or for damages resulting from
17.\" the use of the information contained herein. The author(s) may not
18.\" have taken the same level of care in the production of this manual,
19.\" which is licensed free of charge, as they might when working
20.\" professionally.
c13182ef 21.\"
fea681da
MK
22.\" Formatted or processed versions of this manual, if unaccompanied by
23.\" the source, must acknowledge the copyright and authors of this work.
4b72fb64 24.\" %%%LICENSE_END
fea681da
MK
25.\"
26.\" Modified Sat Jul 24 13:30:06 1993 by Rik Faith <faith@cs.unc.edu>
27.\" Modified Sun Aug 21 17:42:42 1994 by Rik Faith <faith@cs.unc.edu>
28.\" (Thanks to Koen Holtman <koen@win.tue.nl>)
29.\" Modified Wed May 17 15:54:12 1995 by Rik Faith <faith@cs.unc.edu>
30.\" To remove *'s from status in macros (Thanks to Michael Shields).
31.\" Modified as suggested by Nick Duffek <nsd@bbc.com>, aeb, 960426
32.\" Modified Mon Jun 23 14:09:52 1997 by aeb - add EINTR.
33.\" Modified Thu Nov 26 02:12:45 1998 by aeb - add SIGCHLD stuff.
34.\" Modified Mon Jul 24 21:37:38 2000 by David A. Wheeler
35.\" <dwheeler@dwheeler.com> - noted thread issues.
36.\" Modified 26 Jun 01 by Michael Kerrisk
37.\" Added __WCLONE, __WALL, and __WNOTHREAD descriptions
38.\" Modified 2001-09-25, aeb
c11b1abf 39.\" Modified 26 Jun 01 by Michael Kerrisk, <mtk.manpages@gmail.com>
fea681da 40.\" Updated notes on setting disposition of SIGCHLD to SIG_IGN
599be3ee
MK
41.\" 2004-11-11, mtk
42.\" Added waitid(2); added WCONTINUED and WIFCONTINUED()
f2351505 43.\" Added text on SA_NOCLDSTOP
d9bfdb9c 44.\" Updated discussion of SA_NOCLDWAIT to reflect 2.6 behavior
f2351505 45.\" Much other text rewritten
948fb4ed 46.\" 2005-05-10, mtk, __W* flags can't be used with waitid()
21399189 47.\" 2008-07-04, mtk, removed erroneous text about SA_NOCLDSTOP
fea681da 48.\"
3df541c0 49.TH WAIT 2 2016-07-17 "Linux" "Linux Programmer's Manual"
fea681da 50.SH NAME
0bfa087b 51wait, waitpid, waitid \- wait for process to change state
fea681da
MK
52.SH SYNOPSIS
53.B #include <sys/types.h>
54.br
55.B #include <sys/wait.h>
56.sp
36f8fb2b 57.BI "pid_t wait(int *" "wstatus" );
5895e7eb 58
36f8fb2b 59.BI "pid_t waitpid(pid_t " pid ", int *" wstatus ", int " options );
5895e7eb 60
c10859eb
MK
61.BI "int waitid(idtype_t " idtype ", id_t " id \
62", siginfo_t *" infop ", int " options );
d8b13fb4
MK
63 /* This is the glibc and POSIX interface; see
64 NOTES for information on the raw system call. */
cc4615cc
MK
65.sp
66.in -4n
67Feature Test Macro Requirements for glibc (see
68.BR feature_test_macros (7)):
69.in
70.sp
6e3ac6ba
MK
71.ad l
72.PD 0
cc4615cc 73.BR waitid ():
6e3ac6ba 74.RS 4
f8619b6a 75_XOPEN_SOURCE
cf7fa0a1 76 || /* Since glibc 2.12: */ _POSIX_C_SOURCE\ >=\ 200809L
f8619b6a 77 || /* Glibc versions <= 2.19: */ _BSD_SOURCE
6e3ac6ba
MK
78.RE
79.PD
80.ad
fea681da 81.SH DESCRIPTION
f2351505
MK
82All of these system calls are used to wait for state changes
83in a child of the calling process, and obtain information
84about the child whose state has changed.
85A state change is considered to be: the child terminated;
86the child was stopped by a signal; or the child was resumed by a signal.
87In the case of a terminated child, performing a wait allows
88the system to release the resources associated with the child;
f946c580 89if a wait is not performed, then the terminated child remains in
f2351505
MK
90a "zombie" state (see NOTES below).
91
92If a child has already changed state, then these calls return immediately.
2b9b829d 93Otherwise, they block until either a child changes state or
f2351505
MK
94a signal handler interrupts the call (assuming that system calls
95are not automatically restarted using the
96.B SA_RESTART
97flag of
98.BR sigaction (2)).
99In the remainder of this page, a child whose state has changed
c13182ef 100and which has not yet been waited upon by one of these system
d3b2ef5d 101calls is termed
f2351505 102.IR waitable .
73d8cece 103.SS wait() and waitpid()
fea681da 104The
f2351505 105.BR wait ()
a1ffe9f5 106system call suspends execution of the calling process until one of its
f2351505
MK
107children terminates.
108The call
36f8fb2b 109.I wait(&wstatus)
f2351505
MK
110is equivalent to:
111.nf
112
36f8fb2b 113 waitpid(\-1, &wstatus, 0);
f2351505 114.fi
fea681da
MK
115
116The
f2351505 117.BR waitpid ()
a1ffe9f5 118system call suspends execution of the calling process until a
f2351505 119child specified by
fea681da 120.I pid
f2351505
MK
121argument has changed state.
122By default,
123.BR waitpid ()
d9bfdb9c 124waits only for terminated children, but this behavior is modifiable
f2351505
MK
125via the
126.I options
127argument, as described below.
fea681da
MK
128
129The value of
130.I pid
f2351505 131can be:
fea681da 132.IP "< \-1"
f2351505 133meaning wait for any child process whose process group ID is
fea681da
MK
134equal to the absolute value of
135.IR pid .
136.IP \-1
f2351505 137meaning wait for any child process.
fea681da 138.IP 0
f2351505 139meaning wait for any child process whose process group ID is
fea681da
MK
140equal to that of the calling process.
141.IP "> 0"
f2351505 142meaning wait for the child whose process ID is equal to the
fea681da
MK
143value of
144.IR pid .
145.PP
146The value of
147.I options
148is an OR of zero or more of the following constants:
a325cc60 149.TP 12
fea681da 150.B WNOHANG
f2351505 151return immediately if no child has exited.
fea681da
MK
152.TP
153.B WUNTRACED
d3b2ef5d 154also return if a child has stopped
f2351505 155(but not traced via
d3b2ef5d
MK
156.BR ptrace (2)).
157Status for
158.I traced
159children which have stopped is provided
160even if this option is not specified.
f2351505 161.TP
31daf529 162.BR WCONTINUED " (since Linux 2.6.10)"
d3b2ef5d 163also return if a stopped child has been resumed by delivery of
f2351505 164.BR SIGCONT .
fea681da
MK
165.PP
166(For Linux-only options, see below.)
167.PP
168If
36f8fb2b 169.I wstatus
8478ee02 170is not NULL,
f2351505
MK
171.BR wait ()
172and
173.BR waitpid ()
a8d55537 174store status information in the \fIint\fP to which it points.
f2351505
MK
175This integer can be inspected with the following macros (which
176take the integer itself as an argument, not a pointer to it,
177as is done in
178.BR wait ()
179and
180.BR waitpid ()!):
fea681da 181.TP
36f8fb2b 182.BI WIFEXITED( wstatus )
fea681da 183returns true if the child terminated normally, that is,
f2351505
MK
184by calling
185.BR exit (3)
186or
a5e0a0e4 187.BR _exit (2),
f2351505 188or by returning from main().
fea681da 189.TP
36f8fb2b 190.BI WEXITSTATUS( wstatus )
f2351505
MK
191returns the exit status of the child.
192This consists of the least significant 8 bits of the
36f8fb2b 193.I wstatus
f2351505 194argument that the child specified in a call to
0bfa087b 195.BR exit (3)
f2351505 196or
0bfa087b 197.BR _exit (2)
f2351505 198or as the argument for a return statement in main().
33a0ccb2 199This macro should be employed only if
fea681da
MK
200.B WIFEXITED
201returned true.
202.TP
36f8fb2b 203.BI WIFSIGNALED( wstatus )
f2351505 204returns true if the child process was terminated by a signal.
fea681da 205.TP
36f8fb2b 206.BI WTERMSIG( wstatus )
fea681da 207returns the number of the signal that caused the child process to
c13182ef 208terminate.
33a0ccb2 209This macro should be employed only if
f2351505
MK
210.B WIFSIGNALED
211returned true.
212.TP
36f8fb2b 213.BI WCOREDUMP( wstatus )
f2351505 214returns true if the child produced a core dump.
33a0ccb2 215This macro should be employed only if
fea681da 216.B WIFSIGNALED
f2351505
MK
217returned true.
218This macro is not specified in POSIX.1-2001 and is not available on
008f1ecc 219some UNIX implementations (e.g., AIX, SunOS).
f2351505 220Only use this enclosed in #ifdef WCOREDUMP ... #endif.
fea681da 221.TP
36f8fb2b 222.BI WIFSTOPPED( wstatus )
f2351505 223returns true if the child process was stopped by delivery of a signal;
33a0ccb2 224this is possible only if the call was done using
0daa9e92 225.B WUNTRACED
fea681da
MK
226or when the child is being traced (see
227.BR ptrace (2)).
228.TP
36f8fb2b 229.BI WSTOPSIG( wstatus )
c13182ef 230returns the number of the signal which caused the child to stop.
33a0ccb2 231This macro should be employed only if
fea681da 232.B WIFSTOPPED
f2351505
MK
233returned true.
234.TP
36f8fb2b 235.BI WIFCONTINUED( wstatus )
31daf529 236(since Linux 2.6.10)
f2351505
MK
237returns true if the child process was resumed by delivery of
238.BR SIGCONT .
73d8cece 239.SS waitid()
f2351505
MK
240The
241.BR waitid ()
242system call (available since Linux 2.6.9) provides more precise
243control over which child state changes to wait for.
244
245The
246.I idtype
247and
248.I id
249arguments select the child(ren) to wait for, as follows:
250.IP "\fIidtype\fP == \fBP_PID\fP"
251Wait for the child whose process ID matches
252.IR id .
253.IP "\fIidtype\fP == \fBP_PGID\fP"
254Wait for any child whose process group ID matches
255.IR id .
256.IP "\fIidtype\fP == \fBP_ALL\fP"
257Wait for any child;
258.I id
259is ignored.
260.PP
261The child state changes to wait for are specified by ORing
262one or more of the following flags in
263.IR options :
a325cc60 264.TP 12
f2351505
MK
265.B WEXITED
266Wait for children that have terminated.
267.TP
268.B WSTOPPED
269Wait for children that have been stopped by delivery of a signal.
270.TP
271.B WCONTINUED
272Wait for (previously stopped) children that have been
273resumed by delivery of
274.BR SIGCONT .
275.PP
276The following flags may additionally be ORed in
277.IR options :
a325cc60 278.TP 12
f2351505
MK
279.B WNOHANG
280As for
281.BR waitpid ().
282.TP
283.B WNOWAIT
284Leave the child in a waitable state; a later wait call
285can be used to again retrieve the child status information.
286.PP
287Upon successful return,
288.BR waitid ()
289fills in the following fields of the
290.I siginfo_t
291structure pointed to by
292.IR infop :
a325cc60
MK
293.TP 12
294\fIsi_pid\fP
f2351505 295The process ID of the child.
a325cc60
MK
296.TP
297\fIsi_uid\fP
f2351505 298The real user ID of the child.
04d6ea6b 299(This field is not set on most other implementations.)
a325cc60
MK
300.TP
301\fIsi_signo\fP
f2351505
MK
302Always set to
303.BR SIGCHLD .
a325cc60
MK
304.TP
305\fIsi_status\fP
f2351505
MK
306Either the exit status of the child, as given to
307.BR _exit (2)
308(or
309.BR exit (3)),
310or the signal that caused the child to terminate, stop, or continue.
c13182ef 311The
f2351505
MK
312.I si_code
313field can be used to determine how to interpret this field.
a325cc60
MK
314.TP
315\fIsi_code\fP
f2351505
MK
316Set to one of:
317.B CLD_EXITED
318(child called
319.BR _exit (2));
320.B CLD_KILLED
321(child killed by signal);
73ac11ee
GK
322.B CLD_DUMPED
323(child killed by signal, and dumped core);
f2351505 324.B CLD_STOPPED
73ac11ee
GK
325(child stopped by signal);
326.B CLD_TRAPPED
327(traced child has trapped); or
f2351505
MK
328.B CLD_CONTINUED
329(child continued by
330.BR SIGCONT ).
331.PP
332If
333.B WNOHANG
334was specified in
335.I options
336and there were no children in a waitable state, then
337.BR waitid ()
338returns 0 immediately and
339the state of the
340.I siginfo_t
341structure pointed to by
342.I infop
343is unspecified.
c13182ef 344.\" POSIX.1-2001 leaves this possibility unspecified; most
f2351505 345.\" implementations (including Linux) zero out the structure
66d90115 346.\" in this case, but at least one implementation (AIX 5.1)
f2351505
MK
347.\" does not -- MTK Nov 04
348To distinguish this case from that where a child was in a
349waitable state, zero out the
350.I si_pid
c7094399 351field before the call and check for a nonzero value in this field
f2351505 352after the call returns.
47297adb 353.SH RETURN VALUE
f2351505 354.BR wait ():
d3b2ef5d 355on success, returns the process ID of the terminated child;
f2351505
MK
356on error, \-1 is returned.
357
a5e0a0e4 358.BR waitpid ():
d3b2ef5d 359on success, returns the process ID of the child whose state has changed;
f2351505 360if
fea681da 361.B WNOHANG
55ae3c86 362was specified and one or more child(ren) specified by
f2351505 363.I pid
55ae3c86
MK
364exist, but have not yet changed state, then 0 is returned.
365On error, \-1 is returned.
f2351505 366
a5e0a0e4 367.BR waitid ():
c13182ef 368returns 0 on success or
f2351505
MK
369if
370.B WNOHANG
371was specified and no child(ren) specified by
372.I id
373has yet changed state;
374on error, \-1 is returned.
bea08fec 375.\" FIXME As reported by Vegard Nossum, if infop is NULL, then waitid()
47f442b2 376.\" returns the PID of the child. Either this is a bug, or it is intended
74ee79b9 377.\" behavior that needs to be documented. See my Jan 2009 LKML mail
47f442b2 378.\" "waitid() return value strangeness when infop is NULL".
3252fa3f 379.PP
f2351505 380Each of these calls sets
fea681da 381.I errno
f2351505 382to an appropriate value in the case of an error.
fea681da
MK
383.SH ERRORS
384.TP
0daa9e92 385.B ECHILD
c13182ef 386(for
e1d6264d 387.BR wait ())
fea681da
MK
388The calling process does not have any unwaited-for children.
389.TP
0daa9e92 390.B ECHILD
c13182ef
MK
391(for
392.BR waitpid ()
393or
e1d6264d 394.BR waitid ())
f2351505 395The process specified by
fea681da 396.I pid
f2351505
MK
397.RB ( waitpid ())
398or
399.I idtype
400and
401.I id
402.RB ( waitid ())
fea681da 403does not exist or is not a child of the calling process.
8bd58774
MK
404(This can happen for one's own child if the action for
405.B SIGCHLD
406is set to
407.BR SIG_IGN .
4fb31341 408See also the \fILinux Notes\fP section about threads.)
fea681da
MK
409.TP
410.B EINTR
411.B WNOHANG
412was not set and an unblocked signal or a
413.B SIGCHLD
01538d0d
MK
414was caught; see
415.BR signal (7).
fea681da
MK
416.TP
417.B EINVAL
418The
419.I options
420argument was invalid.
47297adb 421.SH CONFORMING TO
2dd578fd 422SVr4, 4.3BSD, POSIX.1-2001.
fea681da 423.SH NOTES
f2351505
MK
424A child that terminates, but has not been waited for becomes a "zombie".
425The kernel maintains a minimal set of information about the zombie
426process (PID, termination status, resource usage information)
427in order to allow the parent to later perform a wait to obtain
428information about the child.
429As long as a zombie is not removed from the system via a wait,
430it will consume a slot in the kernel process table, and if
431this table fills, it will not be possible to create further processes.
432If a parent process terminates, then its "zombie" children (if any)
433are adopted by
e8906093 434.BR init (1),
f2351505
MK
435which automatically performs a wait to remove the zombies.
436
437POSIX.1-2001 specifies that if the disposition of
438.B SIGCHLD
c13182ef 439is set to
f2351505 440.B SIG_IGN
c13182ef 441or the
f2351505
MK
442.B SA_NOCLDWAIT
443flag is set for
0daa9e92 444.B SIGCHLD
c13182ef 445(see
f2351505
MK
446.BR sigaction (2)),
447then children that terminate do not become zombies and a call to
fea681da
MK
448.BR wait ()
449or
450.BR waitpid ()
f2351505 451will block until all children have terminated, and then fail with
fea681da 452.I errno
f2351505
MK
453set to
454.BR ECHILD .
d9bfdb9c 455(The original POSIX standard left the behavior of setting
f2351505
MK
456.B SIGCHLD
457to
458.B SIG_IGN
0e464c2f
MK
459unspecified.
460Note that even though the default disposition of
461.B SIGCHLD
462is "ignore", explicitly setting the disposition to
463.B SIG_IGN
464results in different treatment of zombie process children.)
3818a4f1
MK
465
466Linux 2.6 conforms to the POSIX requirements.
f2351505 467However, Linux 2.4 (and earlier) does not:
fea681da 468if a
c13182ef
MK
469.BR wait ()
470or
e1d6264d 471.BR waitpid ()
f2351505
MK
472call is made while
473.B SIGCHLD
474is being ignored, the call behaves just as though
475.B SIGCHLD
704a18f0 476were not being ignored, that is, the call blocks until the next child
d3b2ef5d 477terminates and then returns the process ID and status of that child.
c634028a 478.SS Linux notes
fea681da 479In the Linux kernel, a kernel-scheduled thread is not a distinct
c13182ef
MK
480construct from a process.
481Instead, a thread is simply a process
fea681da
MK
482that is created using the Linux-unique
483.BR clone (2)
484system call; other routines such as the portable
485.BR pthread_create (3)
486call are implemented using
487.BR clone (2).
488Before Linux 2.4, a thread was just a special case of a process,
489and as a consequence one thread could not wait on the children
490of another thread, even when the latter belongs to the same thread group.
491However, POSIX prescribes such functionality, and since Linux 2.4
492a thread can, and by default will, wait on children of other threads
493in the same thread group.
494.LP
8382f16d 495The following Linux-specific
fea681da
MK
496.I options
497are for use with children created using
948fb4ed 498.BR clone (2);
ff82608e
MK
499they can also, since Linux 4.7,
500.\" commit 91c4e8ea8f05916df0c8a6f383508ac7c9e10dba
501be used with
948fb4ed 502.BR waitid ():
fea681da
MK
503.TP
504.B __WCLONE
505.\" since 0.99pl10
c13182ef 506Wait for "clone" children only.
f14ae16e 507If omitted, then wait for "non-clone" children only.
c13182ef 508(A "clone" child is one which delivers no signal, or a signal other than
fea681da
MK
509.B SIGCHLD
510to its parent upon termination.)
511This option is ignored if
512.B __WALL
513is also specified.
514.TP
31daf529 515.BR __WALL " (since Linux 2.4)"
fea681da 516.\" since patch-2.3.48
31daf529 517Wait for all children, regardless of
fea681da
MK
518type ("clone" or "non-clone").
519.TP
31daf529 520.BR __WNOTHREAD " (since Linux 2.4)"
fea681da 521.\" since patch-2.4.0-test8
31daf529 522Do not wait for children of other threads in
c13182ef
MK
523the same thread group.
524This was the default before Linux 2.4.
cd32ec84
MK
525.PP
526Since Linux 4.7,
527.\" commit bf959931ddb88c4e4366e96dd22e68fa0db9527c
528.\" prevents cases where an unreapable zombie is created if
529.\" /sbin/init doesn't use __WALL.
530the
531.B __WALL
532flag is automatically implied if the child is being ptraced.
0722a578 533.SS C library/kernel differences
7704b6a9
MK
534.BR wait ()
535is actually a library function that (in glibc) is implemented as a call to
536.BR wait4 (2).
537
858f88b8
MK
538Within glibc,
539.\" A waitpid() system call remains, with a comment noting that
540.\" "waitpid() should be * implemented by calling sys_wait4() from libc.a"
541.BR waitpid ()
542is a wrapper function that invokes
543.BR wait (2).
544
d8b13fb4
MK
545The raw
546.BR waitid ()
72896e87 547system call takes a fifth argument, of type
d8b13fb4
MK
548.IR "struct rusage\ *" .
549If this argument is non-NULL,
550then it is used to return resource usage information about the child,
551in the same manner as
552.BR wait4 (2).
553See
554.BR getrusage (2)
555for details.
7484d5a7
MK
556.SH BUGS
557According to POSIX.1-2008, an application calling
558.BR waitid ()
559must ensure that
560.I infop
561points to a
562.I siginfo_t
b437fdd9 563structure (i.e., that it is a non-null pointer).
7484d5a7
MK
564On Linux, if
565.I infop
566is NULL,
567.BR waitid ()
568succeeds, and returns the process ID of the waited-for child.
569Applications should avoid relying on this inconsistent,
570nonstandard, and unnecessary feature.
1fa343d1 571.SH EXAMPLE
cde9f44b 572.\" fork.2 refers to this example program.
c13182ef 573The following program demonstrates the use of
19dbfd0a 574.BR fork (2)
c13182ef 575and
2777b1ca 576.BR waitpid ().
1fa343d1 577The program creates a child process.
c13182ef
MK
578If no command-line argument is supplied to the program,
579then the child suspends its execution using
1fa343d1
MK
580.BR pause (2),
581to allow the user to send signals to the child.
582Otherwise, if a command-line argument is supplied,
c13182ef 583then the child exits immediately,
1fa343d1
MK
584using the integer supplied on the command line as the exit status.
585The parent process executes a loop that monitors the child using
2777b1ca 586.BR waitpid (),
d9bfdb9c 587and uses the W*() macros described above to analyze the wait status value.
1fa343d1
MK
588
589The following shell session demonstrates the use of the program:
9d0cc711 590.in +4n
1fa343d1
MK
591.nf
592
b43a3b30 593.RB "$" " ./a.out &"
1fa343d1
MK
594Child PID is 32360
595[1] 32359
b43a3b30 596.RB "$" " kill \-STOP 32360"
1fa343d1 597stopped by signal 19
b43a3b30 598.RB "$" " kill \-CONT 32360"
1fa343d1 599continued
b43a3b30 600.RB "$" " kill \-TERM 32360"
1fa343d1
MK
601killed by signal 15
602[1]+ Done ./a.out
603$
9d0cc711
MK
604.fi
605.in
9c330504 606.SS Program source
d84d0300 607\&
9d0cc711 608.nf
1fa343d1
MK
609#include <sys/wait.h>
610#include <stdlib.h>
611#include <unistd.h>
612#include <stdio.h>
613
614int
615main(int argc, char *argv[])
616{
617 pid_t cpid, w;
36f8fb2b 618 int wstatus;
1fa343d1
MK
619
620 cpid = fork();
29059a65 621 if (cpid == \-1) {
45949175
MK
622 perror("fork");
623 exit(EXIT_FAILURE);
624 }
1fa343d1
MK
625
626 if (cpid == 0) { /* Code executed by child */
627 printf("Child PID is %ld\\n", (long) getpid());
628 if (argc == 1)
629 pause(); /* Wait for signals */
630 _exit(atoi(argv[1]));
631
632 } else { /* Code executed by parent */
633 do {
36f8fb2b 634 w = waitpid(cpid, &wstatus, WUNTRACED | WCONTINUED);
29059a65 635 if (w == \-1) {
45949175
MK
636 perror("waitpid");
637 exit(EXIT_FAILURE);
638 }
1fa343d1 639
36f8fb2b
MK
640 if (WIFEXITED(wstatus)) {
641 printf("exited, status=%d\\n", WEXITSTATUS(wstatus));
642 } else if (WIFSIGNALED(wstatus)) {
643 printf("killed by signal %d\\n", WTERMSIG(wstatus));
644 } else if (WIFSTOPPED(wstatus)) {
645 printf("stopped by signal %d\\n", WSTOPSIG(wstatus));
646 } else if (WIFCONTINUED(wstatus)) {
1fa343d1
MK
647 printf("continued\\n");
648 }
36f8fb2b 649 } while (!WIFEXITED(wstatus) && !WIFSIGNALED(wstatus));
1fa343d1
MK
650 exit(EXIT_SUCCESS);
651 }
652}
1fa343d1 653.fi
47297adb 654.SH SEE ALSO
f2351505 655.BR _exit (2),
fea681da 656.BR clone (2),
f2351505
MK
657.BR fork (2),
658.BR kill (2),
fea681da 659.BR ptrace (2),
f2351505 660.BR sigaction (2),
fea681da
MK
661.BR signal (2),
662.BR wait4 (2),
663.BR pthread_create (3),
53a1443c 664.BR credentials (7),
fea681da 665.BR signal (7)