UNIXシステムでCtrl-cを使用してSIGINT
を生成している場合、信号はprocess group全体に送信されています。
setpgidまたはsetsidを使用して、制御ターミナルによって生成されたシグナルを受信しないように、子プロセスを別のプロセスグループに入れる必要があります。
[編集]
は慎重setpgid
ページの根拠セクションを必ずお読みください。潜在的な競争条件をすべてここに詰め込むのはちょっと難しいことです。
は何
SIGINT
があなたの子プロセスに配信されません100%を保証するために、あなたはこのような何かをする必要があります。
#define CHECK(x) if(!(x)) { perror(#x " failed"); abort(); /* or whatever */ }
/* Block SIGINT. */
sigset_t mask, omask;
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
CHECK(sigprocmask(SIG_BLOCK, &mask, &omask) == 0);
/* Spawn child. */
pid_t child_pid = fork();
CHECK(child_pid >= 0);
if (child_pid == 0) {
/* Child */
CHECK(setpgid(0, 0) == 0);
execl(...);
abort();
}
/* Parent */
if (setpgid(child_pid, child_pid) < 0 && errno != EACCES)
abort(); /* or whatever */
/* Unblock SIGINT */
CHECK(sigprocmask(SIG_SETMASK, &omask, NULL) == 0);
厳密に言えば、これらのステップの一つ一つが必要です。 fork
の呼び出しの直後にユーザーがCtrl-Cを押すと、信号をブロックする必要があります。親が何かをする時間がある前にexecl
が起こった場合は、子供の中でsetpgid
に電話する必要があります。親の親のが実行され、誰かが子のに何かする時間がある前にCtrl-Cを押すと、setpgid
を親に呼び出す必要があります。
上記のシーケンスは不器用ですが、競合条件の100%を処理します。
どのオペレーティングシステムですか? – Nemo
現在、私はDebian 5.0.8でこれをテストしています – xx77aBs