Wil*_*ard 27 process-management init zombie-process
据我了解,僵尸进程已经死亡,但仍作为进程表中的占位符存在,直到其父进程(或者init
如果僵尸进程本身是孤儿)检查其退出状态。
我对孤儿进程的理解是,它们仍然活着并运行,但其父进程已经死亡。
既然丧尸已经死了,那么它的孩子就会被视为孤儿,不是吗?他们会受到影响收割僵尸吗?具体来说,init
是在收割僵尸后才收养他们作为孩子,还是会在父母变成僵尸后立即收养他们?
Gil*_*il' 15
据我了解,僵尸进程已经死亡,但仍作为进程表中的占位符存在,直到其父进程(或 init 如果僵尸本身是孤儿)检查其退出状态。
正确的。
我对孤儿进程的理解是,它们仍然活着并运行,但其父进程已经死亡。
正确的。
既然丧尸已经死了,那么它的孩子就会被视为孤儿,不是吗?
是的。当父母去世时,它就死了。对于它的孩子,父母是否继续作为僵尸存在并不重要:孩子在父母去世时成为孤儿,然后他们与父母失去任何联系。
他们会受到影响收割僵尸吗?具体来说,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;
}
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)