停止したプロセスを含む新しい孤立プロセスグループにSIGHUPを送信するのはなぜですか?

停止したプロセスを含む新しい孤立プロセスグループにSIGHUPを送信するのはなぜですか?

これUNIX環境の高度なプログラミングBOOK("APUE") と

子プロセスに分岐してから終了するプロセスを考えてみましょう。これは奇妙なことではありませんが(常に発生します)、親プロセスが終了したときに子プロセスが停止した場合(ジョブ制御を使用)、どうなりますか?その子はどのように生き残り、その子は自分が孤児になったことを知っていますか?

...

プロセスグループが分離されていない場合は、別のプロセスグループにあるが同じセッション内の親プロセスの1つが、分離されていないプロセスグループで停止したプロセスを再開できます。

...

親プロセスが終了すると、プロセスグループは孤立し、プロセスグループには停止したプロセスが含まれているため、POSIX.1では、新しく孤立したプロセスグループの各プロセスに停止信号(SIGHUP)を送信し、続行信号(SIGCONT)送信する必要があります。 )。

プロセス構成が孤児になった後に停止したプロセスが起きる機会がないという問題がある場合は、プロセス構成が孤立したときにカーネルがSIGCONTを送信しないのはなぜですか、SIGHUPを送信するのはなぜですか? ?

答え1

実際に懸念されるのは、停止したプロセスが目覚める機会がないというだけでなく、孤児プロセスになったことを知らせることです。

あなたのAPUEの抜粋は次のとおりです。

子供がいますか?知る孤児になりましたか?

SIGCONTのみを受信した場合、孤児になったことは不明です。

実際、SIGHUPをサブプロセスに送信することは、このイベントに関する通知を受け取るために選択された方法です。

これは、接続解除イベントのためにシェル自体がSIGHUPを受信したときに一部のシェル(Bashなど)が子プロセスで実行する操作と一致します。おなじみの場合は、HUP + CONTを介してもこれを行います。クラスイベントが伝播されます。この特別な場合にサブプロセスを停止します。また、参考として、SIGNALSセクションのすぐ下にあるBashのマニュアルページも参照してください。

実際、これらのカーネルの振る舞いは、そのシェルの特定の振る舞いを孤立したプロセスグループの場合まで拡張します。


私の答えをより詳しく説明するために、歴史的にSIGHUP + SIGCONTではなくただSIGKILLだったことを最初に申し上げます。

ある時点で、これはあまりにも過酷なアプローチと見なされました。実際、この方法では、プロセスは少なくとも「優雅に終了」する可能性さえありません。つまり、やっていたことを完了し、リソースを解放するなどの作業を行います。

したがって、SIGKILLは現在のよりエレガントなHUP + CONT方法に変更されました。これは、プロセスが自分でクリーンアップする機会だけでなく、必要に応じて実行を続けるオプションも提供します。

私はPOSIX仕様の専門家ではありませんが、次の抜粋の根拠を参考にしてください。_exit() システムコール仕様:

[...]、プロセスの終了によってプロセス構成が孤立したプロセスになると、[...]グループ内で停止したプロセスは永遠に消えます。この問題を回避するために、停止したプロセスを含む新しい孤児プロセスグループには、SIGHUP信号とSIGCONT信号が送信されます。表現セッションの接続が失われました。 SIGHUP シグナルにより、プロセスグループメンバーが終了します。〜しない限り彼らはSIGHUPをキャプチャまたは無視しています。

確かな声明ではないかもしれませんが、かなり近いと思います。

その後、プロセスグループの使用にも注意を払います。いいえシェルアプリケーションによってのみ実装されるジョブ制御に制限されます。あなたできるプロセスには、制御端末や制御シェルを持たない一般的な「デーモン」プロセスなど、独自のセッションがありますが、独自に複数の子プロセスを作成し、そのプロセスを使用して処理できるプロセスグループにグループ化します。グループID。

実際には、プロセスグループの「シェルジョブ制御」の特定のユースケースが最も広く知られており、仕様自体でも優れた例としてよく引用されていますが、「プロセスグループ」の実際のPOSIX定義は次のとおりです。

3.296 プロセスグループ

関連プロセスが信号を発信できるようにするプロセスの集まりです。システム内のすべてのプロセスは、プロセスグループIDによって識別されるプロセスグループのメンバーです。新しく作成されたプロセスは、作成者のプロセスグループに追加されます。

一般的なプロセスの収集。

「作業制御」の定義は次のとおりです。

3.203 ジョブ制御

許可された施設ユーザープロセスの実行を選択的に停止(一時停止)し、後で実行を再開(再開)します。ユーザーは通常、次の方法でこの機能を使用します。ターミナルI/Oドライバとコマンドソルバーの両方で提供される対話型インタフェース

タスク制御は、対話型シェルに関する概念です。

プロセスのグループ化はより広い概念です。

ファタイ

関連情報