在库中处理 Posix 信号

Posted

技术标签:

【中文标题】在库中处理 Posix 信号【英文标题】:Handling Posix signals in a library 【发布时间】:2016-02-18 15:07:18 【问题描述】:

是否有可能以某种方式处理两次 Posix 信号?当进程在我正在编写的库中终止时,我需要执行一些操作。我就是这样做的:

signal(SIGSEGV, sig_handler);
signal(SIGABRT, sig_handler);
signal(SIGFPE, sig_handler);
signal(SIGINT, sig_handler);

这可行,但并不完全可以接受,因为我的图书馆的用户可能出于其他原因想要自己处理信号。我想我会因此而干预。

是否有可能以某种方式处理我的 sig_handler 中的信号,然后“重新抛出”它,以便其他需要它的人透明地使用它?通过“透明”,我还意味着我不想要求用户提供一些“自定义回调”,因为我的库已经定义了接口,没有真正的标题。在任何情况下,我都需要一些回调进程终止,为用户透明地安装并为用户透明地处理。有这样的吗?这个解决方案在 Linux 上运行就足够了。谢谢!

【问题讨论】:

您希望在SIGABRTSIGSEGV 之后执行哪些操作? 我需要终止一个进程并向设备发送一个字符串。我知道在 SIGSEGV 之后很难/不可能,因为允许的调用很少,但我不在乎。我尽我所能,如果它不起作用,我会忍受它。更相关的是 SIGINT。 【参考方案1】:

最好的选择可能是使用 sigaction 来获取当前回调并将您的回调放在中间。 This SO answer 解释它。但是,如果应用程序在您设置它之后您将根本看不到任何调用。

获取当前的:

struct sigaction sa;
sigaction(SIGINT, NULL, &sa);
...

设置你的:

struct sigaction sa;
...
sigaction(SIGINT, &sa, NULL);

在您的回调中,您调用第一个。

【讨论】:

以上是关于在库中处理 Posix 信号的主要内容,如果未能解决你的问题,请参考以下文章

无法处理的 POSIX 信号的返回码

从 C++ 中的 posix 信号处理程序获取对象属性

linux c编程:Posix信号量

UNP卷一学习笔记:POSIX信号处理

UNP卷一学习笔记:POSIX信号处理

Golang信号处理和优雅退出守护进程