如果在UNIX中的信号处理期间,相同的信号被发送到程序会发生什么?

bod*_*ydo 9 c unix signals pipe

有什么想法吗?是否存在某种信号队列,还是会被丢弃?

虽然我们正处于这个问题,但是信号处理人员应该尽可能少地完成工作吗?

我在某处读到信号处理程序应该使用管道并只写一个字节,指示程序应该做什么.然后在其他地方程序定期检查管道,并根据其中的字节进行调度.(我可能误解了它)

谢谢,Boda Cydo.

Tyl*_*nry 8

为了回答你问题的第二部分,"信号处理人员应该做尽可能少的工作吗?" 答案是肯定的,因为有一组非常小的功能是"异步信号安全",因此能够从信号处理程序调用.异步信号安全性是一种增强的重入形式.如果foo()异步信号是安全的,那意味着foo()在信号处理程序内调用是安全的,即使foo()在信号被引发时已经执行了.

您可以通过查看signal(man 7 signal)的第7节手册页来获取异步信号安全功能的完整列表.直接或间接地在信号处理程序中调用除了其中一个之外的任何函数,将调用未定义的行为.

"将字节写入管道"方法是处理信号的好方法,不受异步信号安全功能的限制,特别是如果您的程序已经围绕select循环定向.


And*_*ker 7

要回答问题的第一部分,默认值如下:如果它与当前正在处理的信号相同,则新信号被阻塞(保留在队列中)并在处理程序返回时传递.如果某些其他信号到达,则调用新信号的处理程序.比较glibc手册.