僵尸进程去哪儿了?

时间:2021-02-24 05:27:47

标签: c linux unix fork systems-programming

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;
}

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

1 个答案:

答案 0 :(得分:1)

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

PID 1 通常是 init 守护进程,如果它工作正常,那么它的子进程应该总是 wait()。所以僵尸孩子会立即被收割,还在跑的孩子一退出就会被收割。

如果你想创建一个长寿命的僵尸,父级需要保持存活但不调用 wait()