现在的位置: 首页 > 综合 > 正文

关于SIGCHLD的不排队,丢弃的问题

2013年04月12日 ⁄ 综合 ⁄ 共 871字 ⁄ 字号 评论关闭

signal(SIGCHLD, SIG_IGR); //忽略SIGCHLD信号,这常用于并发服务器的性能的一个技巧
                          //因为并发服务器常常fork很多子进程,子进程终结之后需要
                          //服务器进程去wait清理资源。如果将此信号的处理方式设为
                          //忽略,可让内核把僵尸子进程转交给init进程去处理,省去了
                          //大量僵尸进程占用系统资源。(Linux Only)

 关于SIGCHLD的不排队,丢弃的问题

1   用消息队列吧,子进程退出前把自已的PID写进队列
然后父进程去读,不过pid = waitpid(-1, &stat, 0);
让父进程阻塞在调用这块,不过如果你想让waitpid快带返回也行, 如果没接到子进程退出信号,你可以把这个PID再写进去,然后继续读,直到接到SIGCHLD为止。

以前在项目中遇到过此问题,大量的并发进程往往造成很多的僵死进程,以至于程序无法响应,当时被这个问题弄得很头痛,直到想到这个方法以后才有效的解决了上述问题。

为方法就等于实现了一个对SIGCHLD的排队机制。

2
关键是一句话信号和waitpid没有关系!一个触发条件,一个是动作,程序写为while(...),就是考虑可能的收到一个信号,释放多个僵尸进程。

根本就不需要找回来!
好比有五个进程,
不妨分别称为 p1 p2 p3 p4 p5,
一开始 p1 结束了,发了一个 SIGCHLD(s1),
这时父进程可能空闲了,于是开始处理这个信号,假设处理的过程中 p2 又结束了,又发了一个 SIGCHLD(s2),
这时候已经有两个信号了(一个正在处理,一个待处理),这时如果 p3 又结束了,那么它发的那个 SIGCHLD(s3) 势必会丢失,
丢失了怎么办?
没关系,因为那个信号处理函数是个循环嘛,
所以 while(waitpid()) 的时候,会把 p1 p2 p3 都处理的。

抱歉!评论已关闭.