int main()
{
if (!fork()) sleep(3000);
exit(0);
}
シェルから上記のプログラムを呼び出すと、孤立プロセスが作成されます。
- 採用
init
または採用upstart
(私のUbuntuデスクトップから) - シェルと同じセッションで
- 失われたチームリーダー
- シェルジョブ制御なしで管理、これは、シェルがSIGHUPを受信してもSIGHUPを受信しないことを意味します。
4 について: 私はbash
これを Ubuntu デスクトップでテストし、確認しました。これがSIGHUP以外の信号で動作するかどうかはわかりません。ジョブと同じ場合disown
:jobs
コマンドでリストされていないプロセスグループはSIGHUPを受け取りません。
すべてのFDをオフにしてchdir
ファイルに書き込むこともできるので、このデーモンと通常のデーモンの唯一の違いは次のとおりです。
- 私のプロセスはまだシェルと同じセッションを共有しています。
- 私のプロセスには、示されているようにまだ "control tty"があります。
ps j
だから私の質問は:このプロセスをデーモンと見なすことはできますか?
つまり、デーモンがsetsid()
cttyなしで新しいセッション(call)にあるのはなぜそれほど重要ですか?これは、シェルが呼び出されたのと同じセッションとは関係がないためです(そうでない場合は訂正してください)。 ctty接続?
つまり、デーモンとして機能するプロセスがセッションをそのまま維持し、端末に接続され続けているのはなぜ悪いのですか(FDを閉じても)。
私はこれらの問題が本質的に同じだと思います。よろしくお願いします。