C中是否有办法知道有关信号的以下信息:
由于
答案 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
干杯!