+ -
当前位置:首页 → 问答吧 → 如何防止SIGCLD信号丢失啊

如何防止SIGCLD信号丢失啊

时间:2010-08-27

来源:互联网

本程序有两个测试目的.
1. 子进程死亡后, 父进程才开始对SIGCLD感兴趣,还会不会受到SIGCLD信息.
2. 会不会出现SIGCLD丢失的情况.

代码如下:
  1. #include<stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/wait.h>
  4. #include <signal.h>
  5. //信号处理函数,调用wait, 清楚僵尸进程
  6. void  a(int sig)
  7. {
  8.     int status;
  9.     int pid;
  10.     signal(SIGCLD,a);
  11.     pid=wait(&status);
  12.     printf("%d  cleared\n",pid);
  13. }

  14. int main()
  15. {
  16.     int res;
  17.     int status;
  18.     int count=0; //计数器
  19.     while(1)
  20.     {
  21.         count++;
  22.         printf("%d\n",count);
  23.         if(count==15)  //等到15秒时才启动该信号.其实此时已经有5个僵尸了.
  24.             //以测试, SIGCLD是否可以在进程死亡之后受到.
  25.             signal(SIGCLD,a);
  26.         sleep(1);
  27.         res=fork(); //每秒fork一个进程
  28.         if(res<0)
  29.         {
  30.             exit(0);
  31.         }
  32.         else if(res==0){
  33.             //子进程什么也不干,sleep 10 秒后自己死亡.
  34.             int mypid=getpid();
  35.             printf("%d %d is born\n",count, mypid);
  36.             sleep(10);
  37.             printf("%d %d die\n",count,mypid);
  38.             exit(0);
  39.         }
  40.         if(count>100){
  41.             break;
  42.         }
  43.         
  44.     }
  45.     while(1)
  46.     {
  47.         sleep(1);//此处等待是否能将所有的僵死都clear掉.
  48.     }   
  49. }
复制代码
测试结果发现, 系统结束时,有一个僵死进程
bldr:/home/jianmiw >> ptree 27604
9024  /opt/ssh/etc/sshd -f /etc/ssh/sshd_config
  24960 /opt/ssh/etc/sshd -f /etc/ssh/sshd_config -R
    27604 -ksh
      7968  ./a.out
        29246 <defunct>

由于程序输出太多.所以没有贴出来.但是从输出可以看到29246 是第86个产生的进程, 所以与一开始等了5秒钟后打开signal没有关系.
确实出现了SIGCLD信号丢失的情况. 请问我该如何解决,以防止该信号丢失.  这样父进程才能很好的控制自己子进程的数量.

谢谢!

作者: mingjwan   发布时间: 2010-08-27

说了多少次,signal()是不可靠信号。为确保可靠,应该用POSIX信号:sigaction()。

作者: tjmao   发布时间: 2010-08-27