免费注册 查看新帖 |

Chinaunix

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

UNIX或Linux系统对信号是否有排队机制 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-04-07 22:02 |只看该作者
原帖由 loc1129 于 2006-4-7 21:57 发表
我测试的背景:一个父进程创建5个子进程,然后这5个子进程差不多在同一时刻递交5个SIGCHLD信号给父进程,测试结果如我前面所说
      那么此时,对于wait来说应该是不阻塞的,它和waitpid一样获得了执行,但为什 ...

Maybe the  kernel code about signal handling can tell you something,try to read it.

论坛徽章:
0
12 [报告]
发表于 2006-04-07 22:23 |只看该作者
原帖由 loc1129 于 2006-4-7 21:57 发表
我测试的背景:一个父进程创建5个子进程,然后这5个子进程差不多在同一时刻递交5个SIGCHLD信号给父进程,测试结果如我前面所说
      那么此时,对于wait来说应该是不阻塞的,它和waitpid一样获得了执行,但为什 ...


不能用人的时间尺度来判断程序到底阻塞不阻塞。

你给让子进程随机sleep一段时间,测试一下看看。

论坛徽章:
0
13 [报告]
发表于 2006-04-07 22:57 |只看该作者
测试过while(waitpid())形式非阻塞形式确实可以解决问题,

哪位高人可以再说说wait为什么不行,

论坛徽章:
0
14 [报告]
发表于 2006-04-08 00:41 |只看该作者
原帖由 rwen2012 于 2006-4-7 22:57 发表
测试过while(waitpid())形式非阻塞形式确实可以解决问题,

哪位高人可以再说说wait为什么不行,



我来说一下吧!首先记住这样一个事实:“信号可以阻塞但不会排队!”
当父进程正在处理第一个信号的时候,假设第二个信号SIGCHLD到来,它就会被阻塞并添加到待处理信号集里。(运用:信号可以阻塞)
如果这个时候第三个SIGCHLD到来,因为已经有一个待处理信号了,所以第三个SIGCHLD信号会被抛弃。(运用:信号不会排队)
一段时间以后,处理程序返回。内核注意到有一个待处理的SIGCHLD信号,就迫使父进程接受这个信号。父进程捕获这个信号,并第二次调用信号处理程序。处理程序执行完后返回,这个时候已经没有待处理的SIGCHLD信号了(因为第三个已经被抛弃了)!所以第三个子进程成为了僵尸进程!

而如果我们这样使用while((pid=waitpid(-1,NULL,0))>0)
            ……
当第一次执行信号处理函数的时候,就可以回收1、2、3子进程。(最多是第二次就可以全部回收)!

不知道说清楚没有

论坛徽章:
0
15 [报告]
发表于 2006-04-09 12:19 |只看该作者
认真地、仔细地、不要一知半解地读一读APUE.

论坛徽章:
0
16 [报告]
发表于 2006-04-09 13:45 |只看该作者
传统Unix信号是不排队的, 较新的Posix实时信号是排队的。

论坛徽章:
0
17 [报告]
发表于 2006-04-09 14:39 |只看该作者
原帖由 wz_uestc 于 2006-4-8 00:41 发表

我来说一下吧!首先记住这样一个事实:“信号可以阻塞但不会排队!”
当父进程正在处理第一个信号的时候,假设第二个信号SIGCHLD到来,它就会被阻塞并添加到待处理信号集里。(运用:信号可以阻塞)
如果 ...


测试程序如下
  void sig_chld(int signo)
       {
               pid_t pid;
               int stat;
               while((pid=waitpid(-1,&stat,WNOHANG))>0)
                     sleep(5);
               return ;
       }
然后保证在5秒内向父进程递交3个SIGCHLD,此时按照信号不排队的观点,应该至少有一个SIGCHLD被丢弃,但测试结果是没有一个被丢弃,这好像与不排队的观点相矛盾,为什么?

论坛徽章:
0
18 [报告]
发表于 2006-04-09 14:41 |只看该作者
原帖由 albcamus 于 2006-4-9 13:45 发表
传统Unix信号是不排队的, 较新的Posix实时信号是排队的。


unix网络编程 第一卷中介绍,SIGCHLD是UNIX传统信号,应该是要排队的

论坛徽章:
0
19 [报告]
发表于 2006-04-09 23:01 |只看该作者
原帖由 loc1129 于 2006-4-9 14:41 发表


unix网络编程 第一卷中介绍,SIGCHLD是UNIX传统信号,应该是要排队的


??

如果排队直接用wait()不就行了?

还是没有搞清楚

论坛徽章:
0
20 [报告]
发表于 2006-04-10 10:19 |只看该作者
顶一下,值得关注这个问题.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP