一尘不染

同一信号具有多个信号处理程序是否有效?

linux

我有两个共享库链接到我的测试应用程序。这两个库都具有的信号处理程序SIGINT

同一信号具有多个信号处理程序是否有效?生成SIGINT信号时,处理程序将执行哪个顺序?


阅读 290

收藏
2020-06-03

共1个答案

一尘不染

正如其他人所说,只能设置一个信号处理程序,这是最后一个。然后,您将不得不自己管理调用两个函数。该sigaction函数可以返回以前安装的信号处理程序,您可以自己调用该信号处理程序。

这样的东西(未经测试的代码):

/* other signal handlers */
static void (*lib1_sighandler)(int) = NULL;
static void (*lib2_sighandler)(int) = NULL;

static void aggregate_handler(int signum)
{
    /* your own cleanup */
    if (lib1_sighandler)
        lib1_sighandler(signum);
    if (lib2_sighandler)
        lib2_sighandler(signum);
}

... (later in main)
struct sigaction sa;
struct sigaction old;

lib1_init(...);
/* retrieve lib1's sig handler */
sigaction(SIGINT, NULL, &old);
lib1_sighandler = old.sa_handler;

lib2_init(...);
/* retrieve lib2's sig handler */
sigaction(SIGINT, NULL, &old);
lib2_sighandler = old.sa_handler;

/* set our own sig handler */
memset(&sa, 0, sizeof(sa));
sa.sa_handler = aggregate_handler;
sigemptyset(&sa.sa_mask);
sigaction(SIGINT, &sa, NULL);
2020-06-03