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

时间:2015-12-31 10:08:05

标签: c linux sockets daemon

我正在用C编写一个程序,一个服务器 - 客户端传输(socketsendrecv ...)

符合网站http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html
和其他资源一起使用fork()生成新的子进程(可能是写日志文件)后,它们都退出父进程并关闭所有文件描述符(FD)。

我想知道是否有必要这样做,因为我希望在父进程(服务器)的代码中做一些事情。此外,这个父进程将侦听来自套接字的新连接或请求,我想如果关闭所有FD将无效。

感谢。

1 个答案:

答案 0 :(得分:1)

你好像混淆了一下。 “守护进程”仅与在后台启动服务器相关。当此服务器为每个客户端分配一个工作进程时,服务器通常会关闭客户端套接字(因为将来只有工作进程需要它),但当然会使listen-socket保持打开状态而不会退出。

所以:

  • 守护进程是为了让主服务器进程在后台(通常为fork(),退出父进程,子进程关闭stdin / stdout / stderr并调用setsid())

  • 服务器为每个连接分配子级以处理客户端请求并在fork之后关闭客户端套接字,但维护侦听套接字以服务未来的客户端。

如果您需要从此父级守护另一个进程,请使用double-fork():

  • 服务器分叉进程
  • 此过程再次分叉并退出
  • 子进程关闭所有不相关的文件描述符并调用setsid()