我有两个共享库链接到我的测试应用程序。这两个库都具有的信号处理程序SIGINT。
SIGINT
同一信号具有多个信号处理程序是否有效?生成SIGINT信号时,处理程序将执行哪个顺序?
正如其他人所说,只能设置一个信号处理程序,这是最后一个。然后,您将不得不自己管理调用两个函数。该sigaction函数可以返回以前安装的信号处理程序,您可以自己调用该信号处理程序。
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);