据我了解,僵尸进程已经死亡,但仍然作为进程表中的占位符存在,直到其父进程(或者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