私が理解しているように、ゾンビプロセスは終了しましたが、その親(または、ゾンビ自体がオーファンの場合はinit
)が終了ステータスをチェックするまで、プロセステーブルのプレースホルダーとして存在します。
そして、孤立プロセスについての私の理解は、それらはまだ生きていて実行されているが、その親が亡くなったプロセスであるということです。
ゾンビはすでに死んでいるので、その子供たちは孤児とみなされますね?彼らはゾンビを刈り取っている影響を受けますか?具体的には、init
は、ゾンビが刈り取られたときにのみ子として子を採用しますか、それとも親がゾンビになったときにすぐに子を採用しますか?
私が理解しているように、ゾンビプロセスは終了しましたが、親(またはゾンビ自体がオーファンの場合は初期化)が終了ステータスをチェックするまで、プロセステーブルのプレースホルダーとして存在します。
正しい。
そして、孤立プロセスについての私の理解は、それらはまだ生きていて実行されているが、その親が亡くなったプロセスであるということです。
正しい。
ゾンビはすでに死んでいるので、その子供たちは孤児とみなされますね?
はい。親が死ぬと死にます。子に関しては、親がゾンビとして留まっているかどうかは関係ありません。子は親が死んだときに孤児になり、親との接続をすべて失います。
彼らはゾンビを刈り取っている影響を受けますか?具体的には、ゾンビが刈り取られたときにのみ、initを子として採用するのか、それとも親がゾンビになるとすぐに採用するのか。
いいえ、上記のとおり後者です。
実験的な結果が得られれば、少なくとも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;
}
1つのターミナルで:
$ 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