プロセスは子プロセスの所有権を親プロセスに渡すことができますか?
背景
祖父母、親、子という3つのプロセスがあるとしましょう。
両親は子供を産んで生き続けます(両親は死にません)。
子供が死亡すると祖父母が処理するので、子供が死亡したら祖父母に知らせなければならない。 SIGCHLDを手に入れた方が良いでしょう。
答え1
一般に、親プロセスは、wait()
子プロセスが終了したときにゾンビプロセスにならないように、子プロセスを処理する役割を果たします。親プロセスが子プロセスの前に終了した場合、一部のプロセスは親プロセスをクリーンアップする役割を果たし、子プロセスがゾンビプロセスになるのを防ぐ必要があります。デフォルトでは、プロセスが終了すると、残りのサブプロセスはpid 1のプロセスにリセットされます。
Linuxはシステムコールにprctl
このオプションを提供します。PR_SET_CHILD_SUBREAPER
マニュアルページによるとprctl
:
PR_SET_CHILD_SUBREAPER
(Linux 3.4以降)0以外の場合は、
arg2
呼び出しプロセスの「サブサブリッパー」属性を設定し、arg2
0の場合は属性の設定を解除します。
init(1)
子収穫機は子プロセスの役割を果たす。プロセスが孤児になると(つまり、直系の親が終了した場合)、プロセスは最も近い生存先祖子リッパーに再割り当てされます。孤児プロセスへの後続の呼び出しは、
getppid()
子収穫機プロセスのPIDを返し、孤立プロセスが終了すると、子収穫機プロセスはシグナルを受信し、プロセスから終了ステータスを取得できるようになりましSIGCHLD
た。wait(2)
「サブサブリッパー」プロパティの設定は、
fork(2)
サブリッパーで作成されたサブアイテムに継承されませんclone(2)
。この設定はプロセス全体で維持されますexecve(2)
。サブハーベスタプロセス設定は、プロセスの階層グループがサブハーベスタプロセスによって管理され、プロセスの1つ(たとえば、2つのブランチデーモン)が終了した場合、サブハーベスタプロセスに通知が必要なセッション管理フレームワークに役立ちます(おそらくそのプロセス再起動できるように)。同様の理由で、一部の
init(1)
フレームワーク(例systemd(1)
:)は子リッパープロセスを使用します。
これはオプションかもしれませんが、親が死亡した転移的子孫(孫だけではありません)は、呼び出しプロセスの親として再割り当てされます。