有关于此的任何想法吗?是否有某种信号队列,或者是否被丢弃?
虽然我们正处于这个问题,但是信号处理程序应该尽可能少地完成工作吗?
我在某处读到一个信号处理程序应该使用一个管道并只写一个字节,指示程序应该做什么。然后在其他地方程序定期检查管道,并根据其中的字节进行调度。 (我可能误解了它)
谢谢,Boda Cydo。
答案 0 :(得分:8)
要回答问题的第二部分,“信号处理人员应尽可能做最少的工作吗?”答案是肯定的,因为有一组非常小的功能是“异步信号安全”,因此能够从信号处理程序调用。异步信号安全性是一种增强的重入形式。如果foo()
异步信号是安全的,那意味着在信号处理程序中调用foo()
是安全的,即使信号被引发时foo()
已经执行了。
通过查看signal
(man 7 signal
)的第7节手册页,您可以获得异步信号安全功能的完整列表。直接或间接地在信号处理程序中调用除了其中一个之外的任何函数,将调用未定义的行为。
“将一个字节写入管道”方法是一种处理信号的好方法,而不受限于异步信号安全功能,特别是如果您的程序已经围绕select
循环定位。
答案 1 :(得分:7)
要回答问题的第一部分,默认值如下:如果信号与当前正在处理的信号相同,则新信号被阻塞(保留在队列中)并在处理程序返回时传递。如果某些其他信号到达,则调用新信号的处理程序。 c.f. the glibc manual