2011-03-12 31 views
9

我有一个简单的程序在Linux下发送SIGUSR1信号给它的子进程的一个循环。但是当我发送例如有时会发生10个信号,表明孩子只收到3个信号。最后发送的信号总是SIGUSR2,并且每次都收到。信号在C排队

信号排队,或者当进程没有处理前一个时,它被简单地覆盖?有什么方法可以发送队列中的信号?

回答

12

什么情况如下:收到

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

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

基本上,相同类型的未决信号不会排队,而是被丢弃。不,没有简单的方法可以通过这种方式“发送”发送信号。人们总是会假设可能会丢弃几个信号,并试图让处理程序执行清理工作并找出要做的事情(例如,如果所有儿童都在同一时间死亡,则收获儿童)。

+1

非常感谢,那就是问题所在。所以我的解决方案是,在每次接收到SIGUSR1子进程后,我回答SIGUSR2,并且父进程在从子进程接收到SIGUSR2确认之前不会发送另一个SIGUSR1。它似乎工作!再次感谢:) – 2011-03-12 22:52:46

6

如果多个相同类型的信号被发送并且未被处理,它们不会被排队。说程序掩码SIGUSR1,调用kill(getpid(), SIGUSR1) 10次,并揭露SIGUSR1。它只会收到SIGUSR1一次。

1

因此,只有在结构信号sa_flags字段使用标志SA_NODEFER并且从不阻止信号的情况下,SIGIO似乎可以同时对多个文件执行I/O操作。

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