8

我知道当一个进程不能很好地清理(它的资源没有被回收/回收)时,就会创建一个僵尸。在调用 fork() 创建一个新进程后,父进程应该始终调用该进程的 waitpid 来清理它。

我还了解到,通过分叉一个本身由 fork 创建的子进程,然后让该子进程死亡来创建守护进程。显然,一旦您执行此操作,UNIX 中的 init 进程(pid #1)将接管该进程。

我想知道的是 - 据我所知,当父母去世时,它会自动清理孩子 - 那么僵尸是如何首先创建的?

其次,守护进程的父进程死掉了,那么为什么守护进程不被认为是僵尸呢?

4

2 回答 2

15

我想知道的是 - 据我所知,当父母去世时,它会自动清理孩子 - 那么僵尸是如何首先创建的?

不,父母不会自动清理孩子。每当一个进程终止时,它的所有子进程(正在运行的或僵尸进程)都会被该init进程采用。

Zombies 是已经终止的子进程,并且在其父进程还活着但尚未调用wait以获取其退出状态时存在。如果父进程死了(并且没有调用wait),所有的僵尸子init进程都会被进程收养,最终会调用wait所有的僵尸进程来收割它们,因此它们会从进程表中消失。

保留僵尸进程背后的想法是保留有关进程终止的适当数据结构,以防父进程通过wait.

其次,守护进程的父进程死掉了,那么为什么守护进程不被认为是僵尸呢?

守护进程的父进程死亡,但守护进程脱离控制终端并通过setsid系统调用成为进程组领导。

于 2011-09-02T14:44:49.420 回答
0

好吧,当子进程启动时,会在内核级别创建条目及其父进程 ID。由于任何原因(服务器手,父进程从应用程序端杀死等)父进程被杀死而子进程离开。内核无法清理此类进程。只有父进程被授权这样做。因为这样的进程仍然在内核的一个表中,所以它也在消耗资源但什么也不做。所以,它被称为僵尸。

于 2013-01-17T09:16:40.123 回答