僵尸进程的父进程终止后会发生什么?

时间:2013-06-21 13:34:47

标签: c linux zombie-process

我只是好奇,僵尸进程会发生什么,如果它的父母不在乎等待它。

假设我们是父母和孩子。孩子在父母之前终止。

来自APUE:

  

内核为每个终止进程保留少量信息......最低限度   此信息包括进程ID,进程的终止状态....

父母需要使用waitpid()获取此信息 但如果父母在没有等孩子的情况下退出,会发生什么:

内核是否删除了这些信息(当然没有用)? 或者,它一直收集这个垃圾? 这个实现是否具体? 或者,有没有一种标准的方法来处理这种情况?

1 个答案:

答案 0 :(得分:7)

init自动采用孤立进程,它有一个标准SIGCHLD处理程序,只丢弃死进程的任何退出状态。

在你的情况下,如果僵尸进程的父进程死亡,僵尸孤儿将被init采用并清理。

以下代码对此进行测试:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>


int main() {
    pid_t child_pid;
    if (child_pid = fork()) { // fork a child, child will exit straight away
        char name[128];
        sprintf(name, "/proc/%d/stat", child_pid);
        char line[2048];

        // read childs /proc/pid/stat, field 3 will give its status
        FILE * fp = fopen(name, "r");

        while (fgets(line, sizeof(line), fp))
            puts(line);

        fclose(fp);

        usleep(5000000);

        // by now the child will have exited for sure, repeat
        fp = fopen(name, "r");

        while (fgets(line, sizeof(line), fp))
            puts(line);

        fclose(fp);

        // make another child to repeat the process and exit the parent
        if (!fork()) {
            usleep(5000000);
            // both parent and child will have exited by now

            fp = fopen(name, "r");

            // this should fail because init has already cleaned up the child
            if (!fp) {
                perror("fopen");
                return -1;
            }

            while (fgets(line, sizeof(line), fp))
                puts(line);

            fclose(fp);
        }

    }

    return 0;
}