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
。但由于某种原因它没有出现。可能的原因是什么?
答案 0 :(得分:1)
当父节点退出时,它的所有子节点(活着的或僵尸的)都被分配为 PID 1 作为他们的新父节点。请参阅the _exit(2)
man page:“进程的任何子进程都被进程 1 继承”。
PID 1 通常是 init
守护进程,如果它工作正常,那么它的子进程应该总是 wait()
。所以僵尸孩子会立即被收割,还在跑的孩子一退出就会被收割。
如果你想创建一个长寿命的僵尸,父级需要保持存活但不调用 wait()
。