我可以检查待处理的信号并立即执行它们

时间:2011-09-07 07:14:52

标签: c linux signals

我想要做的只是处理代码中某些已知点的信号。因此,在这些点上,我将检查待处理的信号并立即执行其处理程序。

我知道我可以使用sigprocmask阻止信号然后取消阻止它,但是这样,信号将在解锁后的任何时间点传送,这是我不想要的。我想在我的代码中的特定位置精确地执行信号处理程序。换句话说,我想让信号处理同步。

有没有办法实现我想要做的事情?

3 个答案:

答案 0 :(得分:3)

您可以使用sigwait系列调用来获取任何待处理的阻止信号。不可能同时等待信号和其他类型的事件,如果你不想在sigwait中阻止,你可以先使用sigpending检查是否有未决信号。

如果您正在为应用程序使用事件驱动设计,那么在运行循环中通常会有几个fds。对于这种情况,您应该使用写入pipe的信号处理程序。信号将以异步方式传送,但随后会出现在您的运行循环中,只是需要处理的另一个fd。

答案 1 :(得分:1)

如果我理解正确,您只需使用sigwait清除每个待处理信号,然后直接调用您的信号处理函数。

在您要处理和清除待处理信号的代码中,您可以使用sigpending检查是否有信号等待,然后重复调用sigwait以清除待处理信号,手动呼叫信号处理功能,以执行所需的操作。

答案 2 :(得分:0)

当您取消屏蔽它们时,将立即传递任何待处理信号。只需在要传递它们的位置取消屏蔽/重新屏蔽即可。如果您正在使用线程,请注意异步信号(如从kill获得的信号)可以转到任何已解除阻塞的线程。