僵尸进程在他们的父母去世后去了哪里?

时间:2014-06-21 21:44:46

标签: c linux linux-kernel wait zombie-process

Zombie进程是一个已完成执行的进程,但在进程表中仍有一个条目(父进程没有读取其退出代码,或者换句话说,它还没有&#? 34;收获&#34)。

一个孤儿进程是一个父进程已经完成的进程,虽然它仍在运行(它的父进程已经过去了#34;但它仍然是#34;活着")。在这种情况下,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秒的僵尸,但是当父进程完成时它的状态是什么?孤儿的僵尸?

在流程表中输入会发生什么?

&#34; orphan-zombies&#34; (如上所述)也被init采用并由它收获?

1 个答案:

答案 0 :(得分:7)

根据man 2 wait

  

终止但尚未等待的孩子成为了   “僵尸”。内核维护有关的最小信息集   僵尸进程(PID,终止状态,资源使用信息)   为了让父母稍后进行等待获得   关于孩子的信息。只要没有移除僵尸   系统通过等待,它将消耗内核进程中的一个槽   表,如果此表填充,则无法创建   进一步的过程如果父进程终止,那么它的“僵尸”   子节点(如果有的话)由init(8)采用,它自动执行   等待移除僵尸。

当父进程完成时,init将采用子进程(即使它是一个僵尸进程)。然后,正如您所说,initwait()作为其退出状态。

所以,我认为“孤儿僵尸”不是特例。