僵尸会有孤儿吗?孤儿们会因为收割丧尸而感到不安吗?

Wil*_*ard 27 process-management init zombie-process

据我了解,僵尸进程已经死亡,但仍作为进程表中的占位符存在,直到其父进程(或者init如果僵尸进程本身是孤儿)检查其退出状态。

我对孤儿进程的理解是,它们仍然活着并运行,但其父进程已经死亡。

既然丧尸已经死了,那么它的孩子就会被视为孤儿,不是吗?他们会受到影响收割僵尸吗?具体来说,init是在收割僵尸后才收养他们作为孩子,还是会在父母变成僵尸后立即收养他们?

Gil*_*il' 15

据我了解,僵尸进程已经死亡,但仍作为进程表中的占位符存在,直到其父进程(或 init 如果僵尸本身是孤儿)检查其退出状态。

正确的。

我对孤儿进程的理解是,它们仍然活着并运行,但其父进程已经死亡。

正确的。

既然丧尸已经死了,那么它的孩子就会被视为孤儿,不是吗?

是的。当父母去世时,它就死了。对于它的孩子,父母是否继续作为僵尸存在并不重要:孩子在父母去世时成为孤儿,然后他们与父母失去任何联系。

他们会受到影响收割僵尸吗?具体来说,init会在僵尸被收割后才收养它们作为它的孩子,还是会在父母变成僵尸后立即收养它们?

不,后者,如上所述。


mur*_*uru 8

如果实验结果行得通,看来至少systemdinit 会尽快收割僵尸的孤儿:

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;
}
Run Code Online (Sandbox Code Playgroud)

在一个终端中:

$ gcc -o foo foo.c
$ ./foo
Run Code Online (Sandbox Code Playgroud)

在另一个终端:

$ 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
Run Code Online (Sandbox Code Playgroud)