为什么fork()两次

Der*_*ike 19 c debugging fork

Nagios让我配置child_processes_fork_twice=<0/1>.

该文件说:

此选项确定Nagios在执行主机和服务检查时是否会fork()子进程两次.默认情况下,Nagios fork()两次.但是,如果启用了use_large_installation_tweaks选项,则只会fork()一次.

据我所知,fork()将产生一个新的子进程.我为什么要两次这样做?

nj-*_*ath 64

好的,现在首先:什么是僵尸进程?

这是一个已经死亡的过程,但是它的父母忙于做其他一些工作,因此它无法收集孩子的退出状态.

在某些情况下,孩子跑了很长时间,父母不能等那么久,并且会继续工作(注意父母不会死,但继续其余的任务,但不关心孩子).

通过这种方式,创建了一个僵尸进程.


现在让我们开始做生意吧.如何在这里分叉两次?

需要注意的重要一点是,孙子进行父进程希望其子进行的工作.

现在第一次调用fork时,第一个孩子只是再次分叉并退出.这样,父母不必等待很长时间来收集孩子的退出状态(因为孩子唯一的工作就是创建另一个孩子并退出).所以,第一个孩子不会变成僵尸.

至于孙子,其父母已经去世了.因此,该init过程将采用孙子,该过程总是收集其所有子过程的退出状态.所以,现在父母不必等待很长时间,也不会创建任何僵尸进程.


还有其他方法可以避免僵尸进程; 这只是一种常见的技术.


希望这可以帮助!

  • 啊.关系很复杂.而init是一个收养孙子的老灵魂. (4认同)

siz*_*erz 22

在Linux中,守护进程通常是通过在分叉孙子后退出中间进程两次来创建的.这具有孤立孙子过程的效果.因此,如果操作系统终止,它将成为操作系统的责任.原因与所谓的僵尸进程有关,这些僵尸进程在退出后继续生存和消耗资源,因为他们的父母通常负责清理,也已经死亡.

  • 我没有看到这比仅仅分叉一次更好.我认为真正的原因与会话和控制终端有关,而不是孤儿,但我可能会弄错... (27认同)

Ale*_*ood 5

同样来自文档,

通常 Nagios 在执行主机和服务检查时会 fork() 两次。这样做是为了 (1) 确保对出错和段错误的插件具有高度的抵抗力,以及 (2) 使操作系统在孙子进程退出后处理它的清理工作。