C中的信号排队

Pet*_*jci 15 c linux queue signals

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

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

Mil*_*lan 18

会发生什么是以下情况:

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

一旦信号处理器完成信号nr1,它将处理信号nr2,然后信号处理器将处理SIGUSR2.

基本上,相同类型的待处理信号不会排队,而是被丢弃.不,没有简单的方法可以"突发"发送信号.人们总是假设可以丢弃几个信号,并试图让处理程序完成清理工作并找出要做的事情(如收养孩子,如果所有孩子同时死亡).

  • 非常感谢,这就是问题所在.所以我的解决方案是,在子进程中每次收到SIGUSR1后,我用SIGUSR2回答,父进程在收到来自孩子的SIGUSR2确认之前不会发送另一个SIGUSR1.它似乎工作!再次感谢:) (2认同)

kub*_*ubi 8

如果发送了多个相同类型的信号但未处理,则它们不会排队.说程序掩码SIGUSR1,调用kill(getpid(), SIGUSR1)10次​​并取消掩码SIGUSR1.它只会收到SIGUSR1一次.