我只是好奇,僵尸进程会发生什么,如果它的父母不在乎等待它。
假设我们是父母和孩子。孩子在父母之前终止。
来自APUE:
内核为每个终止进程保留少量信息......最低限度 此信息包括进程ID,进程的终止状态....
父母需要使用waitpid()
获取此信息
但如果父母在没有等孩子的情况下退出,会发生什么:
内核是否删除了这些信息(当然没有用)? 或者,它一直收集这个垃圾? 这个实现是否具体? 或者,有没有一种标准的方法来处理这种情况?
答案 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;
}