免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: chdonald
打印 上一主题 下一主题

waitpid问题 [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
11 [报告]
发表于 2003-02-11 14:07 |只看该作者

waitpid问题

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


没错,是这样的处理方式呀。没有了已经退出的子进程,当然就退出循环了。其实这个处理并不完善。因为waipid有可能被中断掉,完整的处理方式如下:

{
        int             status;
        pid_t   pid;

        do {
        pid = waitpid(-1, &status, WNOHANG);

} while ( (pid >; 0) || ((-1 == pid) && (EINTR == errno)));

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

waitpid问题

对楼主的问题弟二个问题,最后简要解释一下,这个消息处理函数的使用场景(出自Richar Steven的UNP):
void sig_chld(int signo)
{
      pid_t pid;
      int stat;

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

服务器端父进程的主循环每次为新到来的客户创建一个新的进程之后,会再次阻塞在accept,  一般来说,这个循环"永远"不会退出.
int main()
{
       ....
     for(;{
          newsock = accept(listener,......)
          ...
       }
       ....
}

如果某个处理客户连接的子进程结束, 会向父进程发出SIGCHLD信号, 这个信号会中断父进程的accpet系统调用 (注意,这个中断是不可回复的). 所以Signal(SIGCHLD, sig_chld);告诉父进程收到SIGCHLD信号后进入sig_chld函数对结束的这个子进程进行处理. 但是如果waitpid采用阻塞方式(没有WNOHANG), 或者循环捕捉的话, 整个程序会阻塞在sig_chld函数中,使得服务器的父进程无法对新的客户进行处理.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP