親プロセスが終了すると新しい親プロセスを作成する

親プロセスが終了すると新しい親プロセスを作成する

UNIXでは、親プロセスが終了すると、すべての子プロセスが親プロセスに初期化されるようです。これはずっと本当ではなかったか。例外がありますか?

ベストアンサー1

2014年に書かれた3つの答えはすべて、UnicesとLinuxでは、プロセスが例外なくプロセス#1にリセットされると述べています。 3つの誤った答えです。 ☺

〜のようにステンレス鋼教えてください、一つ引用してくださいその他ここに回答しましたので、再度引用しません。孤児の親プロセスは次のように設定されています。実装定義プロセス。 Cristian Ciupituは、実装定義が何であるかを確認するためにLinuxドキュメントを参照するのが正しいです。しかし、彼は一貫性がなく、最新ではない文書のために誤解を受けました。

2年前この3つの回答が書かれたとき、そして3年前にこの回答が最初に書かれたときにLinuxカーネルが変更されました。 systemd開発者は、プロセス自体を「子収穫者」に設定する機能を追加しました。 Linux 3.4以降、プロセスはprctl()このオプションを使用してシステムコールを実行し、PR_SET_CHILD_SUBREAPERプロセス#1ではなく孤児サブプロセスの親になることができます。これマニュアルページprctl()最新ですが、他のマニュアルページはまだ更新されておらず、一貫性もありません。

バージョン 10.2 では、FreeBSD は既存の機能を拡張して同じ機能を獲得しました。procctl()PROC_REAP_ACQUIREとオプションを含むシステムコールPROC_REAP_RELEASE。 DragonFly BSDでこのメカニズムを採用しました。元reapctl()の名前は4.2でしたprocctl()

したがって、例外があり、非常に目立つ例外があります。 Linux、FreeBSD / PC-BSD、およびDragonFly BSDでは、孤立した子の親が子リッパーとしてマークされた子の最も近い祖先に設定されている場合、またはプロセス#1がある場合、祖先サブリッパープロセスはありません。 systemd(開発者がLinuxカーネルに最初に追加したユーティリティ)、upstart、noshなど、さまざまなデーモン監視ユーティリティでservice-managerすでにこのユーティリティを使用しています。

そのようなデーモン管理者がプロセス#1ではなく、対話型ログインセッションなどのサービスを作成し、そのセッション内で次のことを行う場合fork()二重に「保護」したい(やや間違った)スキルその後、プロセスはプロセス#1の子ではなくデーモンマネージャの子になります。もちろん、ログインセッションから直接デーモンを作成できると期待するのは根本的な間違いです。しかし、ここに別の答えがあります。

追加読書

おすすめ記事