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

标签 c linux handler signals

我有一个在 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_NODEFERSA_RESETHAND 标志。也可以使用这些标志并简单地调用 raise 来实现你想要的,但是如果信号快速连续传递两次,这会产生丑陋的竞争条件,所以你不应该这样做;而是使用我建议的方法。

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

signal(sig, SIG_DFL);
raise(sig);
return;

关于c - 如何向标准信号处理程序添加代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7389105/

相关文章:

c - 无符号字符循环

c - 仅使用一个函数的链表上的合并排序函数

linux - 在redhat中安装namp时出错

linux - Laravel(在 Linux、EC2 上)路由不起作用

用于运行终端命令并通过终端给出结果的 php 脚本

c - 在 while 循环和重新分配期间将带有 scanf 的整数放入内存分配中

c - 仅在 debian 中覆盖我的应用程序的系统调用

java - haddler 中的语音识别器似乎每次都重新打开 Activity

android - 处理程序不调用

python - 从 Tornado Python 中的 RequestHandler 访问 URL