GNU/Linux >> Linux の 問題 >  >> Linux

子プロセスが親の SIGINT を受け取る

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% 処理します。


Linux
  1. 子プロセスのPgidが親のPidではないのはなぜですか?

  2. Linux プロセスのライフ サイクルのしくみ – 親プロセス、子プロセス、および初期化プロセス

  3. プログラムで別のプロセスの親 pid を取得しますか?

  1. 親プロセスの作業ディレクトリを設定するにはどうすればよいですか?

  2. Linuxで親プロセスが強制終了された後、子プロセスがまだ生きているのはなぜですか?

  3. 親プロセスの死を検出する

  1. 親プロセスが終了したときの新しい親プロセス?

  2. Bash:子スクリプトが SIGINT をトラップするときに親スクリプトが SIGINT で終了しないのはなぜですか?

  3. 親 1 で <defunct> プロセスを強制終了する方法