僵尸进程跑哪去了?
Where did the zombie process go?
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;
}
我想故意创建僵尸进程(当然是为了 experimenting/learning)。 child 退出后,parent 不会为 child wait()
。所以,我期待僵尸出现,在 ps -ef | grep zombie.o
。但由于某种原因,它没有出现。可能的原因是什么?
当 parent 退出时,它的所有 children(活着的或僵尸)都被分配 PID 1 作为它们的新 parent。请参阅 the _exit(2)
man page:“进程的任何 children 都由进程 1 继承”。
PID 1 通常是 init
守护进程,如果它工作正常,那么它的 children 应该总是 wait()
。所以僵尸children会马上收割,还有运行的children一退出就会收割
如果你想创建一个long-lived僵尸,parent需要保持存活但不调用wait()
。
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;
}
我想故意创建僵尸进程(当然是为了 experimenting/learning)。 child 退出后,parent 不会为 child wait()
。所以,我期待僵尸出现,在 ps -ef | grep zombie.o
。但由于某种原因,它没有出现。可能的原因是什么?
当 parent 退出时,它的所有 children(活着的或僵尸)都被分配 PID 1 作为它们的新 parent。请参阅 the _exit(2)
man page:“进程的任何 children 都由进程 1 继承”。
PID 1 通常是 init
守护进程,如果它工作正常,那么它的 children 应该总是 wait()
。所以僵尸children会马上收割,还有运行的children一退出就会收割
如果你想创建一个long-lived僵尸,parent需要保持存活但不调用wait()
。