ゾンビに孤児がありますか?孤児はゾンビを収穫することについて怒っていますか?

ゾンビに孤児がありますか?孤児はゾンビを収穫することについて怒っていますか?

私が理解しているように、ゾンビプロセスは終了しますが、親プロセス(またはゾンビ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

関連情報