我了解到,如果进程无法很好地清理(不会回收/获取其资源),则会创建一个僵尸。调用fork()创建新进程后,父级应始终在该进程上调用waitpid进行清理。
我还了解到,通过 fork 本身由fork创建的 child ,然后让 child 死亡而创建了守护程序。显然,一旦您执行了此操作,UNIX中的init进程(pid#1)就会接管该进程。
我想知道的是-据我所知,当 parent 去世时,它会自动清理 child -那么首先如何创建僵尸?
其次,守护进程的父进程死了,那么为什么守护进程不被认为是僵尸呢?
最佳答案
不, parent 不会自动清理 child 。每当进程终止时,init
进程将采用其所有子级(运行中的或僵尸的)。
僵尸是已经终止的子进程,当它们的父级还活着但尚未调用wait
以获得其退出状态时就存在。如果 parent 去世了(并且没有调用wait
),那么所有的僵尸 child 都会被init
进程采用,并且最终会调用所有 child 的wait
来获取它们,因此它们将从进程表中消失。
保持僵尸进程背后的想法是,在 parent 通过wait
引起兴趣的情况下,保留有关进程终止的适当数据结构。
守护进程的父进程终止,但是守护进程从控制终端分离,并通过setsid
系统调用成为进程组领导者。
关于UNIX僵尸和守护程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7285109/