UNIX僵尸和守护进程

UNIX僵尸和守护进程,unix,daemon,zombie-process,Unix,Daemon,Zombie Process,我知道当一个进程没有很好地清理(它的资源没有被回收/收获)时,就会产生僵尸。在调用fork()创建新进程之后,父进程应该始终调用该进程上的waitpid来清理它 我还了解到,一个守护进程是通过分叉一个本身由fork创建的子进程,然后让该子进程死亡而创建的。显然,一旦您这样做了,UNIX中的init进程(pid#1)将接管该进程 我想知道的是——据我所知,当父母去世时,它会自动清理孩子——那么一个僵尸是如何被创造出来的呢 其次,守护进程的父进程会消亡,那么为什么不将守护进程视为僵尸呢 我想知道的是

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

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

我想知道的是——据我所知,当父母去世时,它会自动清理孩子——那么一个僵尸是如何被创造出来的呢

其次,守护进程的父进程会消亡,那么为什么不将守护进程视为僵尸呢

我想知道的是——据我所知,当一位父母去世时,他会死 自动清理子对象-那么如何创建僵尸呢 首先

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

僵尸是已经终止的子进程,当其父进程仍处于活动状态但尚未调用
wait
以获取其退出状态时,它们就会存在。如果父进程死亡(并且没有调用
wait
),则
init
进程将采用所有僵尸子进程,并最终对所有子进程调用
wait
,以获取它们,因此它们将从进程表中消失

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

第二,守护进程的父进程会消亡,为什么不呢 守护进程被视为僵尸


daemonized进程的父进程会消亡,但daemonized进程会从控制终端分离,并通过
setId
系统调用成为进程组的领导者。

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

有人想对匿名否决和关闭请求发表评论吗?我觉得这是一个错误相当可靠的问题。可以说这更像是一个服务器故障问题,但进程管理与*nix编程相关,所以我看不出有什么问题。父进程已死亡的进程是孤儿,而不是僵尸。僵尸是“活死人”;孤儿可以是社会的生产成员。挑剔:除进程外的所有进程s1是子进程,而僵尸只是“活死人”中的一个,一个已经死亡但其父进程尚未等待收集尸体状态的进程。僵尸是一个问题,因为它在进程表中占据了一个插槽,在尸体被清理之前无法重用(由原始父进程或由系统执行,如果父进程未等待就死亡)。在极端情况下(200000僵尸),它们会严重降低系统的速度。今年早些时候,我遇到了这个问题:一个系统进程每分钟有三个僵尸。O/S更新!除了这个好答案之外,还有一个补充:保留僵尸的一个原因是在父进程处理完终止消息之前不应重用PID。在早期版本的Solaris中,只有父进程被授权清理子进程,但如果父进程死亡,则从Solaris 11初始化进程清理所有僵尸进程本身。