在库中处理 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 上运行就足够了。谢谢!
【问题讨论】:
您希望在SIGABRT
或SIGSEGV
之后执行哪些操作?
我需要终止一个进程并向设备发送一个字符串。我知道在 SIGSEGV 之后很难/不可能,因为允许的调用很少,但我不在乎。我尽我所能,如果它不起作用,我会忍受它。更相关的是 SIGINT。
【参考方案1】:
最好的选择可能是使用 sigaction 来获取当前回调并将您的回调放在中间。 This SO answer 解释它。但是,如果应用程序在您设置它之后您将根本看不到任何调用。
获取当前的:
struct sigaction sa;
sigaction(SIGINT, NULL, &sa);
...
设置你的:
struct sigaction sa;
...
sigaction(SIGINT, &sa, NULL);
在您的回调中,您调用第一个。
【讨论】:
以上是关于在库中处理 Posix 信号的主要内容,如果未能解决你的问题,请参考以下文章