我如何知道信号的当前状态

时间:2010-09-20 17:42:30

标签: c signals

C中是否有办法知道有关信号的以下信息:

  1. 现在某个信号被阻止了吗?
  2. 我们是否在一个信号处理函数chanin中(即,当前代码是从函数调用的,它被称为某个信号的信号处理程序)?如果是这样,我能知道当前的信号是什么吗?
  3. 由于

2 个答案:

答案 0 :(得分:3)

您可以通过使用第二个参数null和第三个参数non-null调用sigprocmask来了解当前阻止的信号(在这些条件下忽略第一个参数,因此传递零)。它会填写您提供的sigset_t作为第三个参数。

我不知道有任何方法可以知道堆栈上是否有信号处理程序帧。我想你可能会以某种方式使用_Unwind_*系列函数,但这将是一个可怕的kludge。

答案 1 :(得分:0)

首先,您可以将sigprocmask与空集指针一起使用。

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

一个。怎么设置为: SIG_UNBLOCK(设置中的信号从当前阻塞信号集中删除。尝试解锁未被阻止的信号是合法的)

set可以设置为NULL(因为您不想更改阻止的信号)

℃。如果oldset不是NULL,则信号掩码的先前值将存储在oldset中。因此,您会在地址存储在oldset中的位置获取被阻止的信号。

其次,为了知道您是否处于信号处理程序中,当您编写信号处理程序定义时,您可以接受int signum作为参数,如下所示:

void mySignalHandler(int signum);

如果你想知道你可以在那个时间点阻止一些其他的信号,你可以在开始时放一个阻塞功能。最后解锁功能(使用sigprocmask())。您甚至可以将所述信号设置为SIG_IGN状态,以便在处理当前信号时忽略它们(使用signal())。

最后阅读 man 页面!

修改 由于作者说他确实阅读过它们,我建议使用apropos命令来查找难以找到的功能。例如,

$ apropos "blocked signals"

为您提供大约5次点击,其中1次为sigprocmask

干杯!