我在Linux下有一个简单的程序,它在一个周期内发送SIGUSR1信号给它的subprocess。 但是当我发送例如10个信号时,有时会发生,孩子只收到3个信号。 最后发送的信号总是SIGUSR2,并且每次都收到。
信号是排队的,还是当进程没有处理以前的时候,它只是被覆盖? 有什么方法可以发送队列中的信号?
会发生什么是以下几点:
一旦信号处理程序完成信号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。