如果一个进程结束了,不论是正常的还是非正常的,内核都会通过发送SIGCHLD 信号给父进程。子进程的结束是个异步事件,父进程执行这个信号,通过内核的异步通知。
父进程通过调用wait 和 waitpid 可以 1 :如果所有的子进程正在运行,父进程阻塞。 2 :如果一个子进程结束了,父进程通过 wait 取得了结束进程的状态值,父进程会立即随着子进程的结束状态返回。 3 :如果进程没有子进程那么返回 error 。
wait和 waitpid 的函数原型及头文件定义
#include <sys/wait.h>
pid_t wait(int *statloc);
pid_t waitpid(pid_t pid, int *statloc, int options);
Both return: process ID if OK, 0 (see later), or 1 on error
这两个函数的区别为:
1: wait 会阻塞调用者,直到一个子进程结束。而 waitpid 函数有一个选项防止它阻塞。
2: wait 函数不会等待子进程先结束;他有一系列的选项来控制等待那个进程。
下面为一个调用wait 等待的例子:
在Ubuntu10.4 上的结果:
main pid is 2305,my ppid is 1265
child pid is 2306,my ppid is 2305//after waitted 5s,continue to execute
my pid is 2305,i have waited 2306 died,my ppid is 1265
child pid is 2307,my ppid is 2305
my pid is 2305,i have waited 2306 died,my ppid is 1265
在这个程序中,由于第一个fork 长生的子进程中, sleep 了 5 秒,所以运行到此处,主程序阻塞 5 秒后运行。这也是 wait 函数的一个不足之处,要阻塞主程序,来等待子程序的结束。