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

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

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の子ではなくデーモンマネージャの子になります。もちろん、ログインセッションから直接デーモンを作成できると期待するのは根本的な間違いです。しかし、ここに別の答えがあります。

追加読書

答え2

~によるとexitSingle 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

私の意見を答えに移すと...例外があるとは思いません。

「子プロセスが終了する前に親プロセスが終了することがあります。この場合、すべてのプロセスの親」プロセスがinit新しいPPID(親プロセスID)になります。源泉

IBMにも同様の説明があります。ブログinit:「親プロセスが子プロセスよりも先に死んだり死んだりします。上記の場合、子プロセスは孤立プロセスになります(親プロセスを失うためです)。失うと、そのinitプロセスは新しい親プロセスになります。」

答え4

私はそれが本当だと信じていません。常にinitプロセスに入ります。

http://en.wikipedia.org/wiki/Orphan_process

関連情報