c-Linux:两次分叉和守护进程(ise)之间的区别



我试图编写一个基本的多处理tcp服务器,它为每个新的accept()派生一个进程。

我不需要父进程等待子进程。我遇到了两种解决方案——两次分叉和守护进程。

  1. 两者之间有什么区别
  2. 在这种情况下,哪个更合适
  3. 在这些因素中选择一个需要考虑哪些因素

有一个细微的区别。

分叉两次:中间子进程不能成为僵尸,前提是它已经退出并由父进程等待。孙子也不能成为僵尸,因为它的父进程(中间子进程)已经退出,所以孙子是孤儿。孤儿(孙子)由init继承,如果它现在退出,则由系统负责清理它。通过这种方式,父进程被免除了等待从子进程收集退出状态信号的责任,并且父进程也可以忙于做一些其他工作。这也使孩子能够长时间跑步,这样时间短的父母就不需要等待那么长的时间。

守护程序:这适用于希望将自己与控制终端分离并作为系统守护程序在后台运行的程序。没有控制终端。

方法的决定取决于手头的需求/场景。

确实需要父进程(最终)为其每个子进程wait(),否则子进程将一直挂起,直到父进程退出。这是一种资源泄漏形式。

分叉两次,中间进程在分叉后立即退出,允许原始进程立即收集子进程(通过wait()),并使孙进程成为孤儿,系统负责清理。这是避免累积僵尸进程的一种方法。孙进程与原始进程保持在同一个进程组中(从而保持在相同的会话中)。

解除监控的目的有些不同。它将生成的(子)进程放入一个没有控制终端的新会话(和新进程组)中。通过一次分叉也可以达到同样的效果,父级立即调用_exit(),子级调用setsid()

系统服务通过守护进程来转义启动它的会话,以免在该会话结束时关闭。这与多处理无关,但与流程管理有很大关系。一个进程双分叉,以避免(大)子进程的进程管理职责;这包括多处理和过程管理两个方面。

同样需要注意的是,双重分叉不仅会推卸流程管理的责任,还会放弃流程管理能力。这是否是一个好的权衡取决于情况。

最新更新