SIGINT
を生成している場合 Ctrl で +C Unix システムでは、シグナルはプロセス グループ全体に送信されます。
setpgid または setsid を使用して子プロセスを別のプロセス グループに配置し、制御端末によって生成されたシグナルを受信しないようにする必要があります。
[編集:]
setpgid
の RATIONALE セクションを必ずお読みください。 ページを慎重に。ここで潜在的な競合状態をすべてプラグインするのは少し難しいです。
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);
厳密に言えば、これらの手順はすべて必要です。ユーザーが Ctrl を押した場合に備えて、シグナルをブロックする必要があります +C fork
の呼び出し直後 . setpgid
に電話する必要があります execl
の場合の子で 親が何かをする前に起こります。 setpgid
に電話する必要があります parent の場合は親で 実行し、誰かが Ctrl を押します +C 子の前 何でもする時間があります。
上記のシーケンスは不器用ですが、競合状態を 100% 処理します。