我正在尝试编写一个基本的多进程TCP服务器,每个新的accept()都会fork一个进程。
我不需要父进程等待子进程。我找到了两种解决方案-双重分叉和守护程序化。
- 这两者有什么区别?
- 在这种情况下哪种更合适?
- 选择其中一种的时候应该考虑哪些因素?
我正在尝试编写一个基本的多进程TCP服务器,每个新的accept()都会fork一个进程。
我不需要父进程等待子进程。我找到了两种解决方案-双重分叉和守护程序化。
有一个微妙的区别。
双重派生:中间子进程已经退出并由父进程等待后,它就不会成为僵尸进程。孙子进程也不会成为僵尸进程,因为它的父进程(中间子进程)已经退出了,所以孙子进程变成了孤儿进程。孤儿进程(孙子进程)会被init接管,并在其退出时由系统负责清理。这样,父进程就无需等待收集来自子进程的退出状态信号,并且父进程可以忙于做其他工作。这也使得子进程可以长时间运行,从而不需要短时间父进程等待。
守护进程:适用于希望脱离控制终端并作为系统守护程序在后台运行的程序。没有控制终端。
选择哪种方法取决于手头的要求/场景。
wait()
),否则子进程将一直挂起,直到父进程退出。这是一种资源泄漏的形式。wait()
),并使孙子进程成为孤儿,由系统负责清理。这是避免累积僵尸进程的一种方法。孙子进程保留在与原始进程相同的进程组(因此与相同的会话)中。_exit()
并且子进程调用setsid()
来实现相同的效果。