日期:2014-05-16  浏览次数:20694 次

关于waitpid这个话的理解
看网上的这段话:
引用 楼主  的回复:
——————————————————————————————————————————————————————————————————————————-
wait&waitpid 的区别是显而易见的,wait等待第一

个终止的子进程,而waitpid则可以指定等待特定的子进程。这

样的区别可能会在下面这种情况时表现得更加明显:当同时有

5个客户连上服务器,也就是说有五个子进程分别对应了5个客

户,此时,五个客户几乎在同时请求终止,这样一来,几乎同

时,五个FIN发向服务器,同样的,五个SIGCHLD信号到达服

务器,然而,UNIX的信号往往是不会排队的,显然这样一来,

信号处理函数将只会执行一次,残留剩余四个子进程作为僵尸

进程驻留在内核空间。此时,正确的解决办法是利用waitpid(-

1, &stat, WNOHANG)防止留下僵尸进程。其中的pid为-1表

明等待第一个终止的子进程,而WNOHANG选择项通知内核在

没有已终止进程项时不要阻塞。

————————————————————————————————————————————————————————————————————

“WNOHANG选择项通知内核在没有已终止进程项时不要阻塞” 这个话怎么理解阿 ?

我认为原作者是错误的,因为waitpid(-1, &stat, WNOHANG)在等到第一个子进程退出时候就返回了。
所以还是会有四个僵尸进程。



------解决方案--------------------
因为非实时信号不排队,极有可能本次信号处理函数回调时已经有5个SIGCHLD到来过了,那么你必须用非阻塞waitpid循环直到waitpid返回0或者-1&&errno==ECHILD,那么你就可以退出信号处理函数了,之所以敢退出,是因为信号处理函数一旦进入就会屏蔽掉信号,所以不会造成任何时间窗口会丢失信号。
------解决方案--------------------
waitpid 带 WNOHANG 参数 返回0,说明当前没有子进程结束
返回-1&&errno==ECHILD 说明当前进程没有子进程或者子进程都结束了