我知道当一个进程没有很好地清理(它的资源没有被回收/收获)时就会创建一个僵尸。在调用fork()创建一个新进程之后,父进程应该总是在该进程上调用waitpid来清理它。
我还了解到,守护进程是通过分叉本身由fork创建的子进程创建的,然后让孩子死掉。显然,UNIX中的init进程(pid#1)将在您执行此操作后保留该进程。
我想知道的是 - 据我所知,当父母去世时,它会自动清理孩子 - 那么僵尸是如何在第一时间创建的?
其次,守护进程的父进程终止,为什么守护进程不被认为是僵尸?
答案 0 :(得分:15)
我想知道的是 - 据我所知,当父母去世时 自动清理孩子 - 所以如何创建僵尸 首先是什么?
不,父母不会自动清理孩子。每当进程终止时,init
进程都会采用它的所有子进程(运行或僵尸)。
僵尸是已经终止的子进程,当父进程仍然活着但尚未调用wait
来获取其退出状态时存在。如果父母去世(并且没有调用wait
),init
进程会采用所有僵尸儿童,并最终在所有儿童身上调用wait
来收获他们,所以他们消失在流程表之外。
保持僵尸进程背后的想法是保持关于进程终止的适当数据结构,以防父母通过wait
感兴趣。
其次,守护进程的父进程会消失,为什么不呢 守护进程被认为是一个僵尸?
守护进程的父进程终止,但守护进程从控制终端分离,并通过setsid
系统调用成为进程组负责人。
答案 1 :(得分:0)
好吧,当子进程启动时,会在内核级别创建条目及其父进程ID。由于任何原因(服务器手,父进程从应用程序端杀死等),父进程被杀死,子进程离开。内核无法清理这样的进程。只有父进程才有权这样做。因为这样的过程仍然在内核的表中,所以它也在吃资源但什么都不做。所以,它叫做僵尸。