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の子ではなくデーモンマネージャの子になります。もちろん、ログインセッションから直接デーモンを作成できると期待するのは根本的な間違いです。しかし、ここに別の答えがあります。
追加読書
- ジョナサン・コベット(2012-03-28)。3.4 ウィンドウマージ 2部。 LWN。
- 「4. さまざまな重要な変化」。Linux 3.4。カーネルの新機能です。 2012.
- デーモンと新生企業。内科。 2014年11月12日。
- レナート・ペトリング(2012-03-23)。prctl:簡単なプロセス管理を許可するには、PR_{SET、GET}_CHILD_SUBREAPERを追加してください。。 Linux/カーネル/git/torvalds/linux.git。
- ディラン、マシュー(2014)。子プロセスを管理するために reapctl() システムコールを追加します。 (3) -> procctl()。トンボ.git。
procctl()
。 DragonFly BSDのマニュアルページ。 §2。- DragonFly BSD 4.2リリースノート。 2015年7月29日。
- コンスタンティン・ベルソフ(2014-12-01)。収穫機加工。 freebsd-archメーリングリスト。