僵尸进程跑哪去了?

Where did the zombie process go?

int main() {
    pid_t pid;
    printf("Parent: %d\n", getpid());

    pid = fork();
    if (pid == -1) {
        perror("fork");
        goto clean_up;
    } else if (pid > 0) {
        sleep(3);           
    } else {
        printf("Child Parent: %d\n", getppid());
        printf("Child: %d\n", getpid());
        printf("Exiting...\n"); 
    }

    clean_up:
    return 0;
}

我想故意创建僵尸进程(当然是为了 experimenting/learning)。 child 退出后,parent 不会为 child wait()。所以,我期待僵尸出现,在 ps -ef | grep zombie.o。但由于某种原因,它没有出现。可能的原因是什么?

当 parent 退出时,它的所有 children(活着的或僵尸)都被分配 PID 1 作为它们的新 parent。请参阅 the _exit(2) man page:“进程的任何 children 都由进程 1 继承”。

PID 1 通常是 init 守护进程,如果它工作正常,那么它的 children 应该总是 wait()。所以僵尸children会马上收割,还有运行的children一退出就会收割

如果你想创建一个long-lived僵尸,parent需要保持存活但不调用wait()