信号丢失

时间:2012-09-17 18:59:30

标签: multithreading multiprocessing

我遇到信号丢失的问题。我的意思是我有这个系统,其中信号由子进程生成并由父进程的其他子进程接收。我已经使用sigwait和sigprocmask来实际阻塞,然后等待信号接收子进程内的信号而不是注册异步处理程序。

现在我运行这个系统。我可以看到,最初,来自子进程的生成信号被接收子进程阻止,然后使用sigwait它们实际处理这些未决信号。因此信号处于待处理状态,然后使用sigwait获取并继续。

但随着时间的推移,我可以看到信号的消耗量不如以前那么多。我的意思是生成了很多信号,接收过程没有处理它们。如果我有很多待处理的信号可能会导致信号丢失吗?

2 个答案:

答案 0 :(得分:0)

待处理信号未排队,如果您没有明确检查或处理它们,将导致它们丢失。这就是为什么你应该检查所有孩子是否终止。

资料来源:Link to some old lecture material.

答案 1 :(得分:0)

只有实时信号(SIGRTMINSIGRTMAX之间的信号),如果您的操作系统支持它们,保证排队(最多SIGQUEUE_MAX个排队信号)。如果接收过程已经有一个具有相同代码的待处理信号,则其他信号可能会丢失。

来自sigaction的规范:

  

如果生成了后续发生的待处理信号,则在实时信号扩展选项下需要排队的情况以外的情况下,信号是否被多次传递或接受是依赖于实现的。