如何防止SIGCLD信号丢失啊
时间:2010-08-27
来源:互联网
本程序有两个测试目的.
1. 子进程死亡后, 父进程才开始对SIGCLD感兴趣,还会不会受到SIGCLD信息.
2. 会不会出现SIGCLD丢失的情况.
代码如下:
复制代码
测试结果发现, 系统结束时,有一个僵死进程
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信号丢失的情况. 请问我该如何解决,以防止该信号丢失. 这样父进程才能很好的控制自己子进程的数量.
谢谢!
1. 子进程死亡后, 父进程才开始对SIGCLD感兴趣,还会不会受到SIGCLD信息.
2. 会不会出现SIGCLD丢失的情况.
代码如下:
- #include<stdio.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <signal.h>
- //信号处理函数,调用wait, 清楚僵尸进程
- void a(int sig)
- {
- int status;
- int pid;
- signal(SIGCLD,a);
- pid=wait(&status);
- printf("%d cleared\n",pid);
- }
-
- int main()
- {
- int res;
- int status;
- int count=0; //计数器
- while(1)
- {
- count++;
- printf("%d\n",count);
- if(count==15) //等到15秒时才启动该信号.其实此时已经有5个僵尸了.
- //以测试, SIGCLD是否可以在进程死亡之后受到.
- signal(SIGCLD,a);
- sleep(1);
- res=fork(); //每秒fork一个进程
- if(res<0)
- {
- exit(0);
- }
- else if(res==0){
- //子进程什么也不干,sleep 10 秒后自己死亡.
- int mypid=getpid();
- printf("%d %d is born\n",count, mypid);
- sleep(10);
- printf("%d %d die\n",count,mypid);
- exit(0);
- }
- if(count>100){
- break;
- }
-
- }
- while(1)
- {
- sleep(1);//此处等待是否能将所有的僵死都clear掉.
- }
- }
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28