10-SIGCHLD信号
26.3 SIGCHLD信号
子进程的终止属异步事件。父进程无法预知其子进程何时终止。(即使父进程向子进程发送SIGKILL信号,子进程终止的确切时间还依赖于系统的调度:子进程下一次在何时使用CPU。)之前已经论及,父进程应使用wait()(或类似调用)来防止僵尸子进程的累积,以及采用如下两种方法来避免这一问题。
- 父进程调用不带WNOHANG标志的wait(),或waitpid()方法,此时如果尚无已经终止的子进程,那么调用将会阻塞。
- 父进程周期性地调用带有WNOHANG标志的waitpid(),执行针对已终止子进程的非阻塞式检查(轮询)。
这两种方法使用起来都有所不便。一方面,可能并不希望父进程以阻塞的方式来等待子进程的终止。另一方面,反复调用非阻塞的waitpid()会造成CPU资源的浪费,并增加应用程序设计的复杂度。为了规避这些问题,可以采用针对SIGCHLD信号的处理程序。