Added example program demonstrating use of fork() and waitpid().

This commit is contained in:
Michael Kerrisk 2005-12-09 16:37:05 +00:00
parent 2f59b1bc3c
commit 1fa343d1ab
1 changed files with 73 additions and 0 deletions

View File

@ -485,6 +485,79 @@ type ("clone" or "non-clone").
.\" since patch-2.4.0-test8
(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.
.SH EXAMPLE
The following program demonstrates the use of
.BR fork(2)
and
.BR waitpid (2).
The program creates a child process.
If no command-line argument is supplied to the program,
then the child suspends its execution using
.BR pause (2),
to allow the user to send signals to the child.
Otherwise, if a command-line argument is supplied,
then the child exits immediately,
using the integer supplied on the command line as the exit status.
The parent process executes a loop that monitors the child using
.BR waitpid (2),
and uses the W*() macros described above to analyse the wait status value.
The following shell session demonstrates the use of the program:
.nf
$ ./a.out &
Child PID is 32360
[1] 32359
$ kill -STOP 32360
stopped by signal 19
$ kill -CONT 32360
continued
$ kill -TERM 32360
killed by signal 15
[1]+ Done ./a.out
$
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
pid_t cpid, w;
int status;
cpid = fork();
if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); }
if (cpid == 0) { /* Code executed by child */
printf("Child PID is %ld\\n", (long) getpid());
if (argc == 1)
pause(); /* Wait for signals */
_exit(atoi(argv[1]));
} else { /* Code executed by parent */
do {
w = waitpid(cpid, &status, WUNTRACED | WCONTINUED);
if (w == -1) { perror("waitpid"); exit(EXIT_FAILURE); }
if (WIFEXITED(status)) {
printf("exited, status=%d\\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("killed by signal %d\\n", WTERMSIG(status));
} else if (WIFSTOPPED(status)) {
printf("stopped by signal %d\\n", WSTOPSIG(status));
} else if (WIFCONTINUED(status)) {
printf("continued\\n");
}
} while (!WIFEXITED(status) && !WIFSIGNALED(status));
exit(EXIT_SUCCESS);
}
}
.fi
.SH "CONFORMING TO"
SVr4, POSIX.1
.SH "SEE ALSO"