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

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

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

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

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

答案1

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

正确的。

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

正确的。

既然丧尸已经死了,那么它的孩子就都算是孤儿了吧?

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

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

不,是后者,如上所述。

答案2

如果实验结果可行,看起来至少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;
}

在一个终端中:

$ 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

相关内容