c - 如何在没有父退出的情况下进行守护进程?

标签 c linux sockets daemon

我正在用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/

相关文章:

python - 为什么我的网络在传递数据之前要等到套接字或 websocket 连接关闭

c - 使用按位的奇偶程序

python 查找软件唯一版本的方法

java - 在服务器上关闭 AtomicBoolean ching 太晚了(Java)

linux - 如何在Linux中复制find命令的结果

linux - 奇怪的 "sh"行为

java - 如何在 Java 应用程序和 C/C++ 客户端之间通过客户端身份验证实现 TLS 加密

c++ - 链接器错误(SDL、OpenGL)

C - getchar 和动态创建的数组

c - TCP Unix send() 非常慢 C