一尘不染

C中的信号排队

linux

我在Linux下有一个简单的程序,该程序可以周期性地将SIGUSR1信号发送到其子进程。但是当我发送例如10个信号时,有时会发生,孩子只接收了3个信号。最后发送的信号始终是SIGUSR2,并且每次都会接收到。

信号是否在排队,或者当进程未处理前一个信号时,信号就会被覆盖?有什么方法可以在队列中发送信号吗?


阅读 281

收藏
2020-06-02

共1个答案

一尘不染

发生了以下情况:

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

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

基本上,相同类型的未决信号不会排队,而是会被丢弃。不,没有简单的方法可以“爆发”这种方式发送信号。人们总是假设可能会丢弃多个信号,并试图让处理程序执行清理工作并找出要做什么(例如收养孩子,如果所有孩子同时死亡)。

2020-06-02