免费注册 查看新帖 |

Chinaunix

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

信号SIGCHLD为什么没有被捕获 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-31 08:53 |只看该作者 |倒序浏览
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<sys/wait.h>

void sig_child(int signo)
{
  int status,res;
  if((waitpid(-1,&status,WNOHANG))<0)
    {
      perror("wait");
      exit(1);
    }
  else
    {
      printf("process exit status %d\n",WEXITSTATUS(status));
    }
  // printf("child has finished\n");
}

int main()
{
  pid_t pid;
  pid=fork();
  if(pid<0)
    {
      perror("fork");
      exit(1);
    }
  else if(pid==0)
    {
      int i;
      for(i=0;i<5;i++)
        printf("child:%d\n",getpid());
      //  sleep(1);
      // printf("\n");
      exit(2);
    }
  else
    {
      int i;
      sigset_t newmask;
      struct sigaction newact,oldact;
      newact.sa_handler=sig_child;
      sigemptyset(&newact.sa_mask);
      newact.sa_flags=0;
      sigaction(SIGCHLD,&newact,&oldact);
      for(i=0;i<6;i++)
        {
          printf("parent:%d\n",getpid());
          sleep(1);
        }
      sigaction(SIGCHLD,&oldact,NULL);
      exit(0);
    }

}
题目如上:运行结果:

[root@localhost 33]# ./a.out
child:10795
child:10795
child:10795
child:10795
child:10795
parent:10794
parent:10794
parent:10794
parent:10794
parent:10794
parent:10794
明明有SIGCHLD的信号处理为什么还是没有捕获该信号?而且我只fork出一个子进程,为什么还会丢失呢?
如果子进程中有sleep(),则结果如下:

[root@localhost 33]# ./a.out
child:9204
child:9204
child:9204
child:9204
child:9204
parent:9203
parent:9203
process exit status 2
parent:9203
parent:9203
parent:9203
parent:9203
结果是能捕获SIGCHLD?
到底什么情况下能捕获SIGCHLD

论坛徽章:
0
2 [报告]
发表于 2012-05-31 13:17 |只看该作者
有没有可能是 子进程结束时,父进程还没有注册SIGCHLD信号的处理函数,因此就走的默认动作(默认忽略SIGCHLD???)

论坛徽章:
0
3 [报告]
发表于 2012-05-31 13:20 |只看该作者
信号只发送一次,, 从你的输出可看出,fork后子进程先执行了。而此时你的sighandl还没设置好时,子进程退出了!!
SIGCHLD信号已经被默认忽略了。


sigset_t newmask;
      struct sigaction newact,oldact;
      newact.sa_handler=sig_child;
      sigemptyset(&newact.sa_mask);
      newact.sa_flags=0;
      sigaction(SIGCHLD,&newact,&oldact);
放到fork前就行了。

论坛徽章:
0
4 [报告]
发表于 2012-05-31 14:32 |只看该作者
回复 3# fdl19881


    确实是这样,非常感谢!

论坛徽章:
0
5 [报告]
发表于 2012-05-31 14:33 |只看该作者
回复 2# dhevil_zhi


    对,就是这样的

论坛徽章:
0
6 [报告]
发表于 2012-06-04 10:25 |只看该作者
子进程退出最好使用_exit()函数.
我遇到过一个问题就是子进程使用exit()函数退出,不知道为什么就是没退出.
我怀疑是子进程退出的时候释放什么资源的时候被阻塞了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP