我在Linux下有一个简单的程序,它在一个循环中将SIGUSR1信号发送到它的子进程。但当我发送时,例如有时会发生10个信号,即孩子只收到其中的3个。最后发送的信号始终是SIGUSR2,每次都会收到。
信号是否排队,或者当进程没有处理前一个时,它只是被覆盖了?有没有办法可以在队列中发送信号?
答案 0 :(得分:17)
以下是:
一旦用信号nr1完成信号处理程序,它将处理信号nr2,然后信号处理程序将处理SIGUSR2。
基本上,相同类型的待处理信号不会排队,而是被丢弃。不,没有简单的方法可以“突发”发送信号。人们总是假设可以丢弃几个信号,并试图让处理程序完成清理工作并找出要做的事情(如收养孩子,如果所有孩子同时死亡)。
答案 1 :(得分:8)
如果发送了多个相同类型的信号但未处理,则它们不会排队。假设程序屏蔽SIGUSR1
,调用kill(getpid(), SIGUSR1)
10次并取消屏蔽SIGUSR1
。它只会收到一次SIGUSR1
。
答案 2 :(得分:3)
您的问题可能是SIGUSR2是立即传送的信号,而其他信号被阻止或排队(状态待定)。
以下是检查未决信号的方法:http://www.gnu.org/s/libc/manual/html_node/Checking-for-Pending-Signals.html
答案 3 :(得分:1)
因此,只有使用标志SA_NODEFER
进行结构sigaction sa_flags
字段并且永远不会阻止信号时,才能使用SIGIO同时对许多文件进行I / O操作。
那么,人们可以从信号处理程序内部获得中断,并为每个被处理的信号创建新线程。这变得很复杂:)所以难怪为什么似乎没有人使用SIGIO。