免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4825 | 回复: 11
打印 上一主题 下一主题

waitpid问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-02-10 13:29 |只看该作者 |倒序浏览
waitpid函数的WNOHANG选项是不阻塞的意思,可是
while ((pid = waitpid(-1, &stat,  WNOHANG)) >; 0){
      printf("ok\n";
}
不是一直要打印ok了吗?

论坛徽章:
0
2 [报告]
发表于 2003-02-10 13:43 |只看该作者

waitpid问题

The waitpid function is used to request status information from a child process whose process ID is pid. Normally, the calling process is suspended until the child process makes status information available by terminating.

论坛徽章:
0
3 [报告]
发表于 2003-02-10 13:49 |只看该作者

waitpid问题

更正下问题:
这是一个一般的SIGCHLD的信号处理函数,用waitpid来防止僵尸进程,不理解的是:
有一个子进程被捕捉到。返回〉0,所以打印并又继续循环,继续捕捉呀,但如果不能马上捕捉到的话,返回=0(非阻塞),不是要马上退出了吗

论坛徽章:
0
4 [报告]
发表于 2003-02-10 14:04 |只看该作者

waitpid问题

是啊,如果是 WNOHANG, 没有子进程结束需要处理,SIGCHLD处理函数就结束了. 如果是死循环检查,太浪费资源,除非是阻塞方式

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2003-02-10 14:38 |只看该作者

waitpid问题

请楼主把正确答案写一下。

论坛徽章:
0
6 [报告]
发表于 2003-02-10 16:35 |只看该作者

waitpid问题

如果想防止僵尸进程的产生,又不想被阻塞,我建议把waitpid函数放在一个消息终端响应函数中。
当子进程退出时会向父进程发送SIGCHLD这个信号。父进程只要捕捉这个信号,然后作相应的处理就可以了。这样程序既不会被阻塞,也不会产生僵尸进程。
另外在solaris下,也就是SVR4内核的系统中,可以忽略SIGCHLD这个信号,这样父进程不需要回收子进程状态,也不会产生僵尸。

论坛徽章:
0
7 [报告]
发表于 2003-02-10 17:22 |只看该作者

waitpid问题

转贴Richard Steven的Unix Network Programming代码

int
main(int argc, char **argv)
{
                ...
        Signal(SIGCHLD, sig_chld);
                for(;
                }
                ...
}

void
sig_chld(int signo)
{
        pid_t        pid;
        int        stat;

        while ( (pid = waitpid(-1, &stat, WNOHANG)) >; 0)
                printf("child %d terminated\n", pid);
        return;
}

论坛徽章:
0
8 [报告]
发表于 2003-02-10 17:48 |只看该作者

waitpid问题

我记得:好象是fork多少个进程就用多少次waitpid。

论坛徽章:
0
9 [报告]
发表于 2003-02-11 09:45 |只看该作者

waitpid问题

需要反复调用,否则就是只处理一次了

论坛徽章:
0
10 [报告]
发表于 2003-02-11 09:49 |只看该作者

waitpid问题

void catchSigCLD()
{
   pid_t status;
   status=wait((int *)0);
   for(int i=0;i<MaxProcesses;i++)
      if(processes.pid==status)
      {
         LOGINFO("received SIGCHLD from %s",processes.command);
         break;
      }
   signal(SIGCHLD,(void(*)(int))catchSigCLD);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP