web-dev-qa-db-ja.com

ゾンビは孤児を持つことができますか?孤児の子供たちはゾンビを刈ることによって邪魔されますか?

私が理解しているように、ゾンビプロセスは終了しましたが、その親(または、ゾンビ自体がオーファンの場合はinit)が終了ステータスをチェックするまで、プロセステーブルのプレースホルダーとして存在します。

そして、孤立プロセスについての私の理解は、それらはまだ生きていて実行されているが、その親が亡くなったプロセスであるということです。

ゾンビはすでに死んでいるので、その子供たちは孤児とみなされますね?彼らはゾンビを刈り取っている影響を受けますか?具体的には、initは、ゾンビが刈り取られたときにのみ子として子を採用しますか、それとも親がゾンビになったときにすぐに子を採用しますか?

27
Wildcard

私が理解しているように、ゾンビプロセスは終了しましたが、親(またはゾンビ自体がオーファンの場合は初期化)が終了ステータスをチェックするまで、プロセステーブルのプレースホルダーとして存在します。

正しい。

そして、孤立プロセスについての私の理解は、それらはまだ生きていて実行されているが、その親が亡くなったプロセスであるということです。

正しい。

ゾンビはすでに死んでいるので、その子供たちは孤児とみなされますね?

はい。親が死ぬと死にます。子に関しては、親がゾンビとして留まっているかどうかは関係ありません。子は親が死んだときに孤児になり、親との接続をすべて失います。

彼らはゾンビを刈り取っている影響を受けますか?具体的には、ゾンビが刈り取られたときにのみ、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
8
muru