我有一个简单的程序在Linux下发送SIGUSR1信号给它的子进程的一个循环。但是当我发送例如有时会发生10个信号,表明孩子只收到3个信号。最后发送的信号总是SIGUSR2,并且每次都收到。信号在C排队
信号排队,或者当进程没有处理前一个时,它被简单地覆盖?有什么方法可以发送队列中的信号?
我有一个简单的程序在Linux下发送SIGUSR1信号给它的子进程的一个循环。但是当我发送例如有时会发生10个信号,表明孩子只收到3个信号。最后发送的信号总是SIGUSR2,并且每次都收到。信号在C排队
信号排队,或者当进程没有处理前一个时,它被简单地覆盖?有什么方法可以发送队列中的信号?
什么情况如下:收到
一旦信号处理程序完成信号nr1,它将处理信号nr2,然后信号处理程序将处理SIGUSR2。
基本上,相同类型的未决信号不会排队,而是被丢弃。不,没有简单的方法可以通过这种方式“发送”发送信号。人们总是会假设可能会丢弃几个信号,并试图让处理程序执行清理工作并找出要做的事情(例如,如果所有儿童都在同一时间死亡,则收获儿童)。
您的问题可能是SIGUSR2是一个立即传送的信号,而其他信号被阻塞或排队(处于状态未决状态)。
这里是你如何检查挂起信号:http://www.gnu.org/s/libc/manual/html_node/Checking-for-Pending-Signals.html
如果多个相同类型的信号被发送并且未被处理,它们不会被排队。说程序掩码SIGUSR1
,调用kill(getpid(), SIGUSR1)
10次,并揭露SIGUSR1
。它只会收到SIGUSR1
一次。
因此,只有在结构信号sa_flags
字段使用标志SA_NODEFER
并且从不阻止信号的情况下,SIGIO似乎可以同时对多个文件执行I/O操作。
那么,可以从信号处理程序中获取中断,并为每个正在处理的单个信号创建新的线程。这变得复杂:)所以难怪为什么没有人似乎使用SIGIO。
非常感谢,那就是问题所在。所以我的解决方案是,在每次接收到SIGUSR1子进程后,我回答SIGUSR2,并且父进程在从子进程接收到SIGUSR2确认之前不会发送另一个SIGUSR1。它似乎工作!再次感谢:) – 2011-03-12 22:52:46