C中的信号排队

时间:2011-03-12 20:51:34

标签: c linux queue signals

我在Linux下有一个简单的程序,它在一个循环中将SIGUSR1信号发送到它的子进程。但当我发送时,例如有时会发生10个信号,即孩子只收到其中的3个。最后发送的信号始终是SIGUSR2,每次都会收到。

信号是否排队,或者当进程没有处理前一个时,它只是被覆盖了?有没有办法可以在队列中发送信号?

4 个答案:

答案 0 :(得分:17)

以下是:

  1. 收到第一个信号,即SIGUSR1,处理程序被调用并正在运行
  2. 收到第二个信号,因为来自nr1的处理程序仍在运行,信号nr2会挂起并被阻止。
  3. 收到第三个信号,因为来自nr1的处理程序仍在运行,信号3将被丢弃。
  4. 第四,第五......等信号与信号nr1相同的信号被丢弃。
  5. 一旦用信号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。