当前位置:  技术问答>linux和unix

一个老调重弹的问题:while循环中wait为什么不能代替waitpid

    来源: 互联网  发布时间:2017-03-04

    本文导语:  本帖最后由 laoshizhuce 于 2010-12-10 17:46:22 编辑 代码如下 signal(SIGCHLD, sig_chld); void sig_child(int signo) {       pid_t pid;      int stat;      while( (pid = waitpid(-1,&stat,WNOHANG)) > 0)      {          printf("child %d...

本帖最后由 laoshizhuce 于 2010-12-10 17:46:22 编辑
代码如下
signal(SIGCHLD, sig_chld);

void sig_child(int signo)

     pid_t pid;
     int stat;
     while( (pid = waitpid(-1,&stat,WNOHANG)) > 0)
     {
         printf("child %d exitn",pid);
     }
     return;
}


网上的说法是:
UNIX对信号是不排队的。当同时有多个子进程结束产生SIGCHLD信号时,由于wait函数会导致调用wait的进程阻塞直到该进程的任意一个子进程结束,因此即使是在wait函数处理子进程的这段很短时间里,也会有可能导致SIGCHLD丢失。而waitpid第三个参数为WNOHANG时不会导致阻塞,因此利用while + waitpid 可以把所有结束的子进程处理掉直到没有已经结束的进程,不会有SIGCHLD丢失。
因此这里不能将waitpid替换成wait,不能去掉while循环,且不能将WNOHANG改为0。

以上的说法到底有没有根据,另外自己想了好久也在PC上验证了几次,感觉是可以用wait代替waitpid的,求高手指教,谢谢

waitpid函数的WNOHANG选项不是指的是当所等待进程尚未结束运行时不阻塞,但是这里显然不符合这个要求啊,因为这里调用waitpid时说明子进程已经结束(waitpid函数位于信号捕捉函数里,而只有发生了SIGCHLD信号才会调用信号捕捉函数)

类似帖子
http://topic.csdn.net/u/20090321/09/b66e6b88-d5c3-4db3-a08f-c30c288077aa.html

|
while循环中调用wait,不能确定该调用几次
全部子进程都被wait之后,再次wait 就阻塞了

|
如果在信号处理函数中使用wait,那就不能用循环,否则何时是个头啊..
如果不用循环,那就可能会漏掉子进程(假定2个子进程几乎在同一时间终止)

|

呵。LZ搞错了。

是这样。假设,有多个子进程。某一个子进程退出。则sig_child()被派发。当还在这个处理函数中执行时,又有其他的子进程退出。由于非实时信号系统只保留一个,因此,只能知道有子进程又退出了,而不知道有几个子进程又退出了。因此,有可能需要多次调用waitXXX()系列的函数来回收僵尸。

OK?

|
啥啊,刚才就想回复 发现刚才的帖子不见了..

|
你不是要循环吗?那你怎么来循环?
while( (pid = wait(&stat)) > 0)
{
    printf("child %d exitn",pid);
}
这样何时是头啊..

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3