【问题标题】:how to daemonize without parent exit?如何在没有父退出的情况下进行守护进程?
【发布时间】:2016-04-05 07:47:09
【问题描述】:

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

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

我想知道是否有必要这样做,因为我希望在父进程(服务器)的代码到来时做一些事情。而且,这个父进程会监听来自socket的新连接或请求,我猜如果关闭所有的FD就无效了。

谢谢。

【问题讨论】:

  • 明确一点,这个fork()子进程不是针对客户端请求的。
  • 这感觉就像一个重言式 - 这就是 daemon() 所做的。真正的问题是您要完成什么...脱离控制终端?还有什么?

标签: c linux sockets daemon


【解决方案1】:

你似乎有点混淆了。 “守护进程”仅与在后台启动服务器有关。当这个服务器为每个客户端派生一个工作进程时,服务器通常会关闭客户端套接字(因为将来只有工作进程需要它),但当然会让监听套接字保持打开状态并且不会退出。

所以:

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

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

如果你需要守护这个父进程的另一个进程,double-fork():

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

【讨论】:

  • 谢谢,但是这个fork()子进程不是来处理客户端请求的,它是在守护进程中写入另一个文件(不属于客户端)。由于程序在daemonize之后需要监听新的请求,而daemonize不需要处理这个请求。
  • 然后你会 double-fork() 并退出第一个分叉进程,它是第二个分叉进程的父进程
猜你喜欢
  • 2012-11-13
  • 2014-06-26
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 2013-04-05
  • 1970-01-01
相关资源
最近更新 更多