处理库中的 Posix 个信号
Handling Posix signals in a library
是否有可能以某种方式处理两次 Posix 信号?当进程在我正在编写的库中终止时,我需要执行一些操作。我这样做很简单:
signal(SIGSEGV, sig_handler);
signal(SIGABRT, sig_handler);
signal(SIGFPE, sig_handler);
signal(SIGINT, sig_handler);
这可行,但不完全可以接受,因为我的库的用户可能出于其他原因想要自己处理信号。我想我会因此而干涉。
是否可以以某种方式处理我的 sig_handler 中的信号,然后 "rethrow" 它可以透明地供其他需要它的人使用? "transparently" 我的意思是我不想让用户提供一些 "custom callbacks",因为我的库已经有一个定义的接口,没有真正的 header。在进程终止的任何情况下,我都需要一些回调,为用户透明地安装并为用户透明地处理。有这样的东西吗?该解决方案适用于 Linux 就足够了。谢谢!
最好的选择可能是使用 sigaction 获取当前回调并将您的回调放在中间。 This SO answer 解释一下。但是,如果应用程序在您之后设置它,您将根本看不到任何调用。
获取当前的:
struct sigaction sa;
sigaction(SIGINT, NULL, &sa);
...
设置你的:
struct sigaction sa;
...
sigaction(SIGINT, &sa, NULL);
在你的回调中你调用了第一个。
是否有可能以某种方式处理两次 Posix 信号?当进程在我正在编写的库中终止时,我需要执行一些操作。我这样做很简单:
signal(SIGSEGV, sig_handler);
signal(SIGABRT, sig_handler);
signal(SIGFPE, sig_handler);
signal(SIGINT, sig_handler);
这可行,但不完全可以接受,因为我的库的用户可能出于其他原因想要自己处理信号。我想我会因此而干涉。
是否可以以某种方式处理我的 sig_handler 中的信号,然后 "rethrow" 它可以透明地供其他需要它的人使用? "transparently" 我的意思是我不想让用户提供一些 "custom callbacks",因为我的库已经有一个定义的接口,没有真正的 header。在进程终止的任何情况下,我都需要一些回调,为用户透明地安装并为用户透明地处理。有这样的东西吗?该解决方案适用于 Linux 就足够了。谢谢!
最好的选择可能是使用 sigaction 获取当前回调并将您的回调放在中间。 This SO answer 解释一下。但是,如果应用程序在您之后设置它,您将根本看不到任何调用。
获取当前的:
struct sigaction sa;
sigaction(SIGINT, NULL, &sa);
...
设置你的:
struct sigaction sa;
...
sigaction(SIGINT, &sa, NULL);
在你的回调中你调用了第一个。