很多书上都说,在信号未被阻塞的情况下,信号的产生和传递之间存在一个时间窗口。
所以我想知道当信号不被阻塞或者信号的产生和传递是原子操作时,时间窗口是否还存在?
如果时间窗口仍然存在,那么当在时间窗口期间还产生一些其他信号(与生成的信号相同或不同)时,会发生什么?
答案1
您问题的某些答案取决于信号处理程序的设置方式。我认为我们正在通过系统调用设置信号处理程序的背景下看待这个问题sigaction(2)
。
a 中的一个元素struct sigaction
名为“sa_mask”。来自man 2 sigaction
:
sa_mask gives a mask of signals which should be blocked during execution of the
signal handler. In addition, the signal which triggered the handler will be
blocked, unless the SA_NODEFER flag is used.
看起来如果您设置正确,即使正在处理的信号也不会被阻止。就我个人而言,我无法想象它的用途,但我的想象力是出了名的有限。
所以,我会说“是的,信号生成和接收进程信号处理程序的调用之间有一个窗口”。因此,可以生成其他信号并将其发送到接收进程。至于那些“其他信号”会发生什么:看起来信号没有“排队”:请参阅此堆栈溢出答案,除了“实时”信号。也就是说,如果内核收到一堆kill(some_pid, SIGHUP)
,则由 表示的进程some_pid
将调用一次 SIGHUP 信号处理函数。