デーモンに接続された端末がないのはなぜですか?

デーモンに接続された端末がないのはなぜですか?

私はLinuxデーモンを生成するルールについて少し混乱しています。デーモンコンポーネントが端末に接続されていないことにはほとんど同意します。また、サンプルコードでは通常、プロセスの親が終了し、デーモンが親をリセットして初期化します。私はこれがそうする方法であることを完全に理解しています。ところで、なぜそうなのでしょうか?プロセスには関連付けられた端末がなく、initの直系サブプロセスです。利点は何ですか?

答え1

https://en.wikipedia.org/wiki/SIGHUP

1.関連端末がないプロセスの利点は何ですか?

POSIX準拠プラットフォームでは、SIGHUP(「シグナル切断」)はプロセスに送信される信号です。制御端子が閉じたとき。 (元のシリアルラインが削除されたプロセスを通知するように設計されています。)

[...]

POSIX 互換システムの基本操作 [SIGHUP] は中断することです。


状況を正しく理解すると、2つの状況があります。

明らかな状況はGNOME端末などの端末エミュレータを閉じるmc、擬似端末装置の基本端末を閉じます。このように閉じると、擬似端末が停止します。これはスレーブデバイスに影響を与えます。この端末で制御されているすべてのプロセスはSIGHUPを受信します。これはいいえ上記の状況。

@JDePB指摘2番目の場合:端末装置を参照するすべてのファイル記述子が閉じられると、途切れも発生します。つまり、デーモンがttyのFD(必ずそうする必要があります)を閉じて、後で他のプロセスでttyの終了したFDを開くと、端末エミュレータが応答せずにマスター擬似端末を開いたままにしても、デーモンはSIGHUPを受け取ります。この機能は、次の方法でエンドデバイス全体で無効にできます。清算HUPCL

しかもvhangup()login以前のセッションが妨げられていないことを確認するためにこのメソッドが呼び出されるようです。または他のもの。この呼び出しはLinux固有のものであり、マニュアルページが非常に短いため、わかりません。

2. initの直系サブプロセスですか?

SIGHUPを受信するプロセスがUnixシェルの場合は、ジョブ制御の一部として通常信号を傍受し、停止したすべてのプロセスを以前に実行し続けます。子プロセスにシグナルを送信する(より正確には、シェル内で内部的に「アクション」と表示されるプロセスグループ)は、デフォルトでそのグループを終了します。

関連情報