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

so.*_*red 5 c linux zombie-process wait linux-kernel

Zombie进程是一个已完成执行的进程,但在进程表中仍有一个条目(父进程没有读取其退出代码,换句话说,它还没有被"收获").

孤立进程是一个父进程已经完成的进程,虽然它仍在运行(它的父进程已"消失",但它仍处于"活着状态").在这种情况下,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;
}
Run Code Online (Sandbox Code Playgroud)

在这里创建的子进程将是一个2秒的僵尸,但是当父进程完成时它的状态是什么?孤儿的僵尸?

它在流程表中的条目会发生什么变化?

"孤儿僵尸"(如上所述)是否也init被它所采用并被收获?

chr*_*hrk 8

根据man 2 wait:

终止但尚未等待的孩子变成了"僵尸".内核维护有关僵尸进程(PID,终止状态,资源使用信息)的最小信息集,以便允许父进程稍后执行等待以获得关于子进程的信息.只要没有通过等待从系统中删除僵尸,它就会占用内核进程表中的一个插槽,如果该表填充,则无法创建进一步的进程.如果父进程终止,那么它的"僵尸"子进程(如果有的话)被init(8)采用,它会自动执行等待删除僵尸.

当父进程完成时,子进程(即使它是一个僵尸进程)将被采用init.然后,如你所说,initwait()退出状态.

所以,我不认为"孤儿僵尸"是任何特例.