信号在C中排队

我在Linux下有一个简单的程序,它在一个周期内发送SIGUSR1信号给它的subprocess。 但是当我发送例如10个信号时,有时会发生,孩子只收到3个信号。 最后发送的信号总是SIGUSR2,并且每次都收到。

信号是排队的,还是当进程没有处理以前的时候,它只是被覆盖? 有什么方法可以发送队列中的信号?

Solutions Collecting From Web of "信号在C中排队"

会发生什么是以下几点:

  1. 接收到的第一个信号,即SIGUSR1处理程序被调用并正在运行
  2. 接收到第二个信号,由于来自nr1的处理程序仍在运行,所以信号nr2会挂起并被阻塞。
  3. 接收到第三个信号,由于来自nr1的处理程序仍在运行,信号3被丢弃。
  4. 丢弃与信号nr1相同类型的第四,第五…等信号。

一旦信号处理程序完成信号nr1,它将处理信号nr2,然后信号处理程序将处理SIGUSR2。

基本上,相同类型的挂起信号不排队,而是被丢弃。 不,没有简单的方法来“发射”这样的发送信号。 一个人总是假定可以丢弃几个信号,并且试图让处理者去做清理工作并找出要做的事情(例如,如果所有的孩子都在同一时间死亡,就要收割孩子)。

如果发送多个相同类型的信号而不处理,则不会排队。 说程序屏蔽SIGUSR1 ,调用kill(getpid(), SIGUSR1) 10次​​,并揭开SIGUSR1 。 它将只接收一次SIGUSR1

您的问题可能是SIGUSR2是一个立即传送的信号,而其他信号被阻塞或排队(处于状态待定状态)。

以下是如何检查未决信号的方法: http : //www.gnu.org/s/libc/manual/html_node/Checking-for-Pending-Signals.html

因此,只有在结构信号sa_flags字段中使用标志SA_NODEFER并且永远不会阻塞信号时,才能使用SIGIO同时执行许多文件的I / O操作。

那么,可以从信号处理程序中获取中断,并为每个处理的单个信号创建新的线程。 这变得复杂:)所以难怪为什么没有人似乎使用SIGIO。