UNIX僵尸和守护进程

时间:2011-09-02 14:41:13

标签: unix daemon zombie-process

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

我还了解到,守护进程是通过分叉本身由fork创建的子进程创建的,然后让孩子死掉。显然,UNIX中的init进程(pid#1)将在您执行此操作后保留该进程。

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

其次,守护进程的父进程终止,为什么守护进程不被认为是僵尸?

2 个答案:

答案 0 :(得分:15)

  

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

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

僵尸是已经终止的子进程,当父进程仍然活着但尚未调用wait来获取其退出状态时存在。如果父母去世(并且没有调用wait),init进程会采用所有僵尸儿童,并最终在所有儿童身上调用wait来收获他们,所以他们消失在流程表之外。

保持僵尸进程背后的想法是保持关于进程终止的适当数据结构,以防父母通过wait感兴趣。

  

其次,守护进程的父进程会消失,为什么不呢   守护进程被认为是一个僵尸?

守护进程的父进程终止,但守护进程从控制终端分离,并通过setsid系统调用成为进程组负责人。

答案 1 :(得分:0)

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