我遇到信号丢失的问题。我的意思是我有这个系统,其中信号由子进程生成并由父进程的其他子进程接收。我已经使用sigwait和sigprocmask来实际阻塞,然后等待信号接收子进程内的信号而不是注册异步处理程序。
现在我运行这个系统。我可以看到,最初,来自子进程的生成信号被接收子进程阻止,然后使用sigwait它们实际处理这些未决信号。因此信号处于待处理状态,然后使用sigwait获取并继续。
但随着时间的推移,我可以看到信号的消耗量不如以前那么多。我的意思是生成了很多信号,接收过程没有处理它们。如果我有很多待处理的信号可能会导致信号丢失吗?
答案 0 :(得分:0)
待处理信号未排队,如果您没有明确检查或处理它们,将导致它们丢失。这就是为什么你应该检查所有孩子是否终止。
答案 1 :(得分:0)
只有实时信号(SIGRTMIN
和SIGRTMAX
之间的信号),如果您的操作系统支持它们,保证排队(最多SIGQUEUE_MAX
个排队信号)。如果接收过程已经有一个具有相同代码的待处理信号,则其他信号可能会丢失。
来自sigaction
的规范:
如果生成了后续发生的待处理信号,则在实时信号扩展选项下需要排队的情况以外的情况下,信号是否被多次传递或接受是依赖于实现的。