我正在用C写一个程序,一个server-client传输(通过socket
, send
, recv
...)
根据网站http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html ,
和其他资源,它们都在使用fork()
产生一个新的子进程(比如写入日志文件)后退出它们的父进程并关闭所有文件描述符(FD)。
我想知道是否有必要这样做,因为我希望在父进程(服务器)的代码到来时做一些事情。而且这个父进程会监听来自socket的新的连接或者请求,估计关闭所有的fd就失效了。
谢谢。
最佳答案
你似乎有点搞混了。 “守护进程”仅与在后台启动服务器有关。当此服务器为每个客户端派生一个工作进程时,服务器通常会关闭客户端套接字(因为将来只有工作进程需要它),但当然会保持监听套接字打开并且不会退出。
所以:
Daemonizing 是为了让主服务器进程在后台运行(通常是
fork()
,退出父进程,子进程关闭 stdin/stdout/stderr 并调用 setsid())服务器为每个连接派生子进程以处理客户端请求,并在派生后关闭客户端套接字,但维护监听套接字以服务 future 的客户端。
如果你需要守护这个父进程的另一个进程,double-fork():
- 服务器 fork 一个进程
- 这个进程再次 fork 并退出
- 子进程关闭所有不相关的文件描述符并调用
setsid()
关于c - 如何在没有父退出的情况下进行守护进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34544710/