テスト アプリケーションにリンクされた 2 つの共有ライブラリがあります。どちらのライブラリにも、SIGINT
.
同じシグナルに対して複数のシグナルハンドラーを持つことは有効ですか? シグナルを生成するときにハンドラーが実行する順序はSIGINT
?
他の人が言ったように、最後のシグナルハンドラーを1つだけ設定できます。その場合、2 つの関数の呼び出しを自分で管理する必要があります。この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);
sigactionの man ページでわかるように、新しいシグナル ハンドラーが古いシグナル ハンドラーを置き換え、古いシグナル ハンドラーが返されます。
未使用のシグナルが 2 つある場合 (たとえばSIGUSR1
とSIGUSR2
)、これらのシグナルに の 2 つのシグナル ハンドラを割り当てますSIGINT
。次に、独自のシグナルハンドラーを作成しSIGINT
、そこから必要な未使用のシグナルを必要に応じて発生させることができます。