web-dev-qa-db-ja.com

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

NIX環境での高度なプログラミング 本( "APUE")は言う

子をフォークしてから終了するプロセスについて考えてみます。これは異常なことではありませんが(常に発生します)、親が終了したときに子が(ジョブ制御を使用して)停止した場合はどうなりますか?子供はどのように続けられますか、そして子供はそれが孤児になったことを知っていますか?

.。

プロセスグループが孤立していない場合、別のプロセスグループにあるが、同じセッションにある親の1つが、孤立していないプロセスグループで停止したプロセスを再開する可能性があります。

.。

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

プロセスグループが孤立した後、停止したプロセスがウェイクアップする機会がないという懸念だけがある場合、プロセスグループが孤立したときにカーネルがSIGCONTを送信しないのはなぜですか?また、SIGHUPも送信する必要があるのはなぜですか?

5
Tim

実際、懸念されるのは、停止したプロセスがウェイクアップされる機会がないということだけでなく、孤立していることが通知されることでもあります。

APUEの抜粋は次のように述べています。

そして、子はそれが孤立していることを知っていますか

SIGCONTを受信しただけでは、孤立していることはわかりません。

実際には、子供にSIGHUPを送信することは、そのイベントを通知するために正確に選択された方法です。

さらに、これは、一部のシェル(Bashなど)が切断イベントのためにシェル自体がSIGHUPを受信したときに子に対して行うことと一致しています。慣れている場合は、HUP + CONTを介して停止した子にもそのようなイベントを伝播します。この特定のケースで。それ以外の場合は、これのリファレンスとして、Bashのマンページ(正確にはSIGNALSセクション)を参照してください。

実際のカーネルによるこの動作は、そのようなシェルの特定の動作を、孤立したプロセスグループのすべてのケースに拡張します。


私の答えをさらに詳しく説明するために、歴史的にはSIGHUP + SIGCONTではなく単なるSIGKILLであったことをお伝えすることから始めます。

ある時点で、これは厳しすぎるアプローチと見なされてきました。実際、そのようにすることで、プロセスは少なくとも「優雅に死ぬ」、つまり、実行していたことを終了したり、リソースを解放したりする機会すらありません。

そのため、SIGKILLはHUP + CONTの現在のより優雅なアプローチに変更され、プロセスが自分自身の後でクリーンアップする機会があるだけでなく、必要に応じて実行を継続することもできます。

私はPOSIX仕様の専門家ではありませんが、たとえば、 _ exit()システムコールの仕様 からの次の理論的根拠の抜粋に注意してください。

[...]、プロセスの終了によりプロセスグループが孤立する場合、[...]。グループ内で停止したプロセスは永久に衰退します。この問題を回避するために、停止したプロセスを含む新しく孤立したプロセスグループには、SIGHUPシグナルとSIGCONTシグナルが送信され、それらが切断されたことを示します彼らのセッション。 SIGHUPシグナルにより、プロセスグループメンバーはSIGHUPをキャッチまたは無視しない限り終了します

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

次に、プロセスグループの使用はnotシェルアプリケーションによってのみ実行されるジョブ制御に限定されることにも注意してください。あなたcan典型的な「デーモン」プロセスのように、制御端末や制御シェルを持たない独自のセッションを持つプロセスがありますが、それでも複数の子自体を生成し、プロセスグループにグループ化します。プロセスグループIDを使用して処理(つまりシグナリング)されます。

実際、プロセスグループの「シェルのジョブ制御」固有のユースケースは最も広く知られているものであり、仕様自体によっても優れた例と呼ばれることがよくありますが、実際のP​​OSIXの「プロセスグループ」の定義は次のとおりです。

3.296プロセスグループ

関連するプロセスのシグナリングを可能にするプロセスのコレクション。システム内の各プロセスは、プロセスグループIDで識別されるプロセスグループのメンバーです。新しく作成されたプロセスは、その作成者のプロセスグループに参加します。

A genericプロセスのコレクション。

「ジョブ制御」の定義は次のとおりです。

3.203ジョブ制御

sersがプロセスの実行を選択的に停止(一時停止)し、後で実行を継続(再開)できるようにする機能。ユーザーは通常、この機能を端末I/Oドライバーとコマンドインタープリターが共同で提供する対話型インターフェイスを介して使用します。

ジョブ制御は、インタラクティブシェルに関連する概念です。

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

HTH

3
LL3