如何解决僵尸进程去哪儿了?
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
。但由于某种原因它没有出现。可能的原因是什么?
解决方法
当父节点退出时,它的所有子节点(活着的或僵尸的)都被分配为 PID 1 作为他们的新父节点。请参阅the _exit(2)
man page:“进程的任何子进程都被进程 1 继承”。
PID 1 通常是 init
守护进程,如果它工作正常,那么它的子进程应该总是 wait()
。所以僵尸孩子会立即被收割,还在跑的孩子一退出就会被收割。
如果你想创建一个长寿命的僵尸,父级需要保持存活但不调用 wait()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。