免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-04-15 15:24 |只看该作者 |倒序浏览
如果说父进程fork了很多子进程并处理SIGCHLD信号已获得子进程统计信息
但是在同一时间有很多子进程结束,这时似乎有很多信号SIGCHLD几乎同时到达
如果我的SIGCHLD信号需要是不可重入的(因为要操作共享资源),如果调用sigprocmask暂时屏蔽SIGCHLD的话,在APUE书上好象讲系统只能向进程传送一次被屏蔽信号
大多数UNIX系统不排队信号,如何判断本系统是否支持信号排队?
谁有比较好的解决方案啊,多谢

论坛徽章:
0
2 [报告]
发表于 2005-04-16 09:25 |只看该作者

UNIX或Linux系统对信号是否有排队机制

没见过排队的。

用 while (waitpid (-1, NULL,  WNOHANG) >;0) 可以吗?

论坛徽章:
0
3 [报告]
发表于 2005-04-27 20:34 |只看该作者

UNIX或Linux系统对信号是否有排队机制

我现在就是用的while (waitpid (-1, NULL,  WNOHANG) >;0),似乎是能解决问题,这样似乎验证了信号是排队的,不然怎么可以用while这样一个一个的捕获?
但是程序执行的时候有不规律的出现僵尸的现象,似乎还是可能丢掉信号的

论坛徽章:
0
4 [报告]
发表于 2005-04-27 20:37 |只看该作者

UNIX或Linux系统对信号是否有排队机制

还有一个问题,程序在SIGCHLD信号处理函数中执行时又获得了SIGCHLD,那么是否会导致这个函数重入?
如果需要在函数中处理临界资源怎么办?

论坛徽章:
0
5 [报告]
发表于 2005-04-28 09:43 |只看该作者

UNIX或Linux系统对信号是否有排队机制

〉〉程序在SIGCHLD信号处理函数中执行时又获得了SIGCHLD,那么是否会导致这个函数重入?
不会,在信号处理程序中会屏蔽当前信号,导致递交延迟

〉〉这样似乎验证了信号是排队的
LINUX不会对普通信号排队。子进程的结束是串行的,如果SIGCHLD信号处理程序的执行时间不是太长的话,父进程应该来得及清理子进程。但如果子进程退出频率过高,可能会导致SIGCHLD信号丢失,这就会产生你提到的不规则的僵死进程。

论坛徽章:
0
6 [报告]
发表于 2006-04-07 20:39 |只看该作者
>>"子进程的结束是串行的,如果SIGCHLD信号处理程序的执行时间不是太长的话,父进程应该来得及清理子进程。但如果子进程退出频率过高,可能会导致SIGCHLD信号丢失,这就会产生你提到的不规则的僵死进程。"
      问:如您所述,那么使用wait调用的结果应该跟waitpid一样,但是为什么使用wait却出现信号丢失,而waitpid却没有?
     wait的测试程序如下
     signal(SIGCHLD,sig_chld);
       void sig_chld(int signo){
             pid_t pid;
             int stat;
             pid=wait(&stat);
             return;
      }
        waitpid 的测试程序如下
     void sig_chld(int signo)
       {
               pid_t pid;
               int stat;
               while((pid=waitpid(-1,&stat,WNOHANG))>0);
               return ;
       }

论坛徽章:
0
7 [报告]
发表于 2006-04-07 20:53 |只看该作者
原帖由 loc1129 于 2006-4-7 20:39 发表
>>"子进程的结束是串行的,如果SIGCHLD信号处理程序的执行时间不是太长的话,父进程应该来得及清理子进程。但如果子进程退出频率过高,可能会导致SIGCHLD信号丢失,这就会产生你提到的不规则的僵死进程 ...

汗,一年前的帖子都被翻出来了。我都是半瓶水,很久没有写程序了,你等高人解答哈。

论坛徽章:
0
8 [报告]
发表于 2006-04-07 21:34 |只看该作者

回复 6楼 loc1129 的帖子

在信号处理程序中会屏蔽当前信号

如果确实是这样的话,
可看看以下我的看法:


wait(&stat);是阻塞型等待
也就是说,wait()要阻塞到所等待的子进程结束才返回。
在这段“等待的子进程结束”的时间内,信号处理程序屏蔽了当前信号SIGCHLD,
父进程也就无法处理其他子进程发的SIGCHLD信号。

waitpid(-1,&stat,WNOHANG)中
WNOHANG会使进程非阻塞地等待。

也就是说,不管等待成功与否,
waitpid(-1,&stat,WNOHANG)都会立即返回,
进程就可以处理其他子进程发的SIGCHLD信号了。

论坛徽章:
0
9 [报告]
发表于 2006-04-07 21:49 |只看该作者
原帖由 westgarden 于 2006-4-7 21:34 发表

如果确实是这样的话,
可看看以下我的看法:


wait(&stat);是阻塞型等待
也就是说,wait()要阻塞到所等待的子进程结束才返回。
在这段“等待的子进程结束”的时间内,信号处理程序屏蔽 ...

maybe you are right.

论坛徽章:
0
10 [报告]
发表于 2006-04-07 21:57 |只看该作者
我测试的背景:一个父进程创建5个子进程,然后这5个子进程差不多在同一时刻递交5个SIGCHLD信号给父进程,测试结果如我前面所说
      那么此时,对于wait来说应该是不阻塞的,它和waitpid一样获得了执行,但为什么结果会不一样呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP