僵尸进程是一个已经完成执行的进程,但在进程表中仍然有一个条目(父级没有读取其退出代码,或者换句话说,它没有被“收获”)。
Orphan 进程是一个进程,其父进程已经完成,尽管它仍然在运行(其父进程已经“过世”,但它仍然“活着”)。在这种情况下,init
将采用它并等待它。
所以考虑一下:
int main(int argv, char *argc[]) {
pid_t p=fork();
if (p<0) {
perror("fork");
}
// child
if (p==0) {
exit(2);
}
// parent sleeps for 2 seconds
sleep(2);
return 1;
}
在这里创建的子进程将是一个僵尸 2 秒,但是当父进程完成时,它的状态是什么?
它在进程表中的条目会发生什么变化?
init
是否也采用了“孤儿僵尸”(如上述)并被其收获?
根据man 2 wait
:
只要没有通过等待从系统中删除僵尸,它将消耗内核进程表中的一个插槽,如果这个表被填充,那么它将无法再创建一个“僵尸进程”(
当父进程完成时,子进程(即使是僵尸进程)将被init
采用。然后,正如您所说,init
将wait()
作为其退出状态。
所以,我不认为“孤儿僵尸”是任何特例。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(45条)