当前位置: 技术问答>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...
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之后,再次wait 就阻塞了
|
如果在信号处理函数中使用wait,那就不能用循环,否则何时是个头啊..
如果不用循环,那就可能会漏掉子进程(假定2个子进程几乎在同一时间终止)
如果不用循环,那就可能会漏掉子进程(假定2个子进程几乎在同一时间终止)
|
呵。LZ搞错了。
是这样。假设,有多个子进程。某一个子进程退出。则sig_child()被派发。当还在这个处理函数中执行时,又有其他的子进程退出。由于非实时信号系统只保留一个,因此,只能知道有子进程又退出了,而不知道有几个子进程又退出了。因此,有可能需要多次调用waitXXX()系列的函数来回收僵尸。
OK?
|
啥啊,刚才就想回复 发现刚才的帖子不见了..
|
你不是要循环吗?那你怎么来循环?
while( (pid = wait(&stat)) > 0)
{
printf("child %d exitn",pid);
}
这样何时是头啊..
while( (pid = wait(&stat)) > 0)
{
printf("child %d exitn",pid);
}
这样何时是头啊..
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。