我正在尝试编写一个基本的多处理tcp服务器,它为每个新的accept()分配一个进程。
我不需要父进程来等待子进程。我遇到了两个解决方案 - 两次分叉和守护。
答案 0 :(得分:3)
有一个微妙的区别。
分叉两次:中级子进程无法成为僵尸,前提是它已退出且已由Parent等待。孙子不能成为一个僵尸,因为它的父母(中间儿童过程)已经退出,所以孙子是一个孤儿。孤儿(孙子)由init继承,如果它现在退出,系统负责清理它。通过这种方式,父进程不再需要等待从子进行收集退出状态信号,并且父进程也可以忙着做其他工作。这也使孩子能够长时间跑步,以便短期父母不必等待那段时间。
后台程序:这适用于希望从控制终端分离并在后台作为系统守护程序运行的程序。没有控制终端。
方法的决定取决于手头的要求/情景。
答案 1 :(得分:2)
您执行需要父进程(最终)wait()
为其每个子进程,否则子进程将一直闲置直到父进程退出。这是资源泄漏的一种形式。
分叉两次,中间过程在分叉后立即退出,允许原始过程立即(通过wait()
)收集孩子,并使孙子过程成为孤儿,系统负责清理。这是避免累积僵尸进程的一种方法。孙子与原始流程保持在同一个流程组(因此也是同一个会话)。
Daemonizing有一个不同的目的。它将得到的(子)进程放在没有控制终端的新会话(和新进程组)中。通过分叉,父母立即呼叫_exit()
并且孩子呼叫setsid()
,可以实现相同的效果。
系统服务守护进程以转义启动它的会话,以便在该会话结束时不关闭。这与多处理几乎没有关系,但与流程管理有很大关系。流程双重分叉以避免(大)子流程的流程管理职责;这有多处理和流程管理方面。
另请注意,双重分叉不仅会消除流程管理责任,还会放弃流程管理能力。这是一个很好的权衡取决于情况。