私が理解しているように、ゾンビプロセスは終了しますが、親プロセス(またはゾンビinit
プロセス自体が孤立プロセスである場合)が終了ステータスを確認するまで、プロセステーブルにプレースホルダとしてまだ存在します。
孤児プロセスに関する私の理解は、彼らがまだ生きていて実行中ですが、親プロセスが終了したプロセスであるということです。
今ゾンビは死んで、その子供たちはみな孤児になりましたか?ゾンビの収穫は影響を受けますか?具体的にはinit
、ゾンビを収穫した後、子供として養子になるか、それとも親がゾンビになった直後に養子ですか?
答え1
私が理解しているように、ゾンビプロセスは終了しますが、親プロセス(またはゾンビ自体が孤立プロセスの場合はinit)が終了ステータスを確認するまで、プロセステーブルにプレースホルダとしてまだ存在します。
正しい。
孤児プロセスに関する私の理解は、彼らがまだ生きていて実行中ですが、親プロセスが終了したプロセスであるということです。
正しい。
今ゾンビは死んで、その子供たちはみな孤児になりましたか?
はい。両親が死んだら死ぬ。子供たちにとって、親がゾンビとして存在し続けるかどうかは重要ではありません。子供たちは両親が死ぬと孤児になり、親との連絡が切れます。
ゾンビの収穫は影響を受けますか?具体的には、initはゾンビを収穫した後に子供として養子になるのか、それともゾンビになった直後に両親を養子にするのでしょうか?
いいえ、上記のように後者です。
答え2
systemd
実験結果が本当なら、少なくともinitはできるだけ早くゾンビ孤児を収穫するようです。
foo.c
:
#include <unistd.h>
int main(void)
{
pid_t child = fork();
if (child < 0)
return -1;
if (child == 0)
{
pid_t grand_child = fork();
if (grand_child < 0)
return -1;
if (grand_child == 0)
sleep (1000);
else
return 0;
}
else
sleep (1000);
return 0;
}
ターミナルから:
$ gcc -o foo foo.c
$ ./foo
他の端末から:
$ pgrep foo
25548
25549
25550
$ pstree -pa 25548
foo,25548
└─(foo,25549)
$ pstree -psa 25550
systemd,1
└─foo,25550
$ ps -o stat,pid -p $(pgrep -d, foo)
STAT PID
S+ 25548
Z+ 25549
S+ 25550