如何向标准信号处理程序添加代码?

2024-02-20

我有一个在 Linux 上运行的 C 应用程序,我需要向标准信号处理程序添加一些代码。我的想法是设置我的处理程序,将指针保存到标准处理程序,并从我的代码中调用保存的处理程序。不幸的是,signal() 和 sigaction() 都没有返回指向标准处理程序的指针。它们都返回 NULL。 有没有办法进行自定义处理并继续标准处理,而无需删除自定义处理程序并再次发送相同的信号?


不存在“标准信号处理程序”;相反,当信号未被处理时,内核会执行默认操作。如果您想在收到信号时执行某些操作,然后遵循默认操作,您可以在信号处理程序末尾执行以下操作:

sigset_t set;
signal(sig, SIG_DFL);
raise(sig);
sigemptyset(&set);
sigaddset(&set, sig);
sigprocmask(SIG_UNBLOCK, &set, 0);

这是假设你使用过sigaction安装你的信号处理程序,并且没有指定SA_NODEFER or SA_RESETHAND旗帜。使用这些标志并简单地调用也可以实现您想要的目的raise,但是如果信号快速连续发送两次,这会产生丑陋的竞争条件,所以你不应该这样做;而是使用我建议的方法。

Edit:实际上,您不必执行任何信号掩码操作,因为从信号处理程序返回将恢复旧的信号掩码。这应该有效:

signal(sig, SIG_DFL);
raise(sig);
return;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何向标准信号处理程序添加代码? 的相关文章

随机推荐