为同一信号设置多个信号处理程序是否有效?

Lun*_*oms 15 c linux signals

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

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

Sha*_*baz 20

正如其他人所说,只能设置一个信号处理程序,这是最后一个.然后,您必须自己管理调用两个函数.该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);
Run Code Online (Sandbox Code Playgroud)


Bry*_*ier 7

每个信号只能安装一个信号处理程序.只有最新安装的处理程序才有效.