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メーリングリスト。
答え2
~によるとexit
Single UNIX®仕様第2版のマニュアルページ:
呼び出しプロセスのすべての既存の子プロセスとゾンビプロセスの親プロセスIDは、実装依存システムプロセスのプロセスIDに設定されます。つまり、これらのプロセスは特別なシステムプロセスによって継承されます。
ほとんどのUnixバリアントでは、この特別なプロセスはinit
(PID 1)です。
Linuxwait(2)
マニュアルページでは、次のことを確認してください。
親プロセスが終了すると、対応する「ゾンビ」子プロセス(存在する場合)はinit(8)によって採用され、自動的にゾンビプロセスの削除を待ちます。
FreeBSDwait(2)
、ネットワークBSDwait(2)
、オープンBSDwait(2)
そしてMac OS Xwait(2)
マニュアルページでもこれを確認してください。
すべての子プロセスが終了するのを待たずに親プロセスが終了すると、残りの子プロセスには親プロセス1 ID(initプロセスID)が割り当てられます。
Oracle Solaris 11.1wait(3C)
マニュアルページでもこれを確認してください。
親プロセスが子プロセスの終了を待たずに終了すると、各子プロセスの親プロセスIDは1に設定され、初期化プロセスは子プロセスを継承します。
Intro(2)
。
答え3
答え4
私はそれが本当だと信じていません。常にinitプロセスに入ります。