Daemon 是通过两次 fork 产生的

查看原文

Unix 上创建 Daemon 进程的常规手段是两次 Fork,根本目的是为了同 Controlling Terminal 分离开。

以 Sander Marechal 的这段代码 为例,初始进程进行第一次 fork,然后 setcwd('/'); setsid(); umask(0),接着进行第二次 fork,然后关闭 stdin, stdout, stderr,最后将进程 ID 写入到 pidfile。

  • Daemon 一般以 root 身份运行,所以 cwd=/, umask=000
  • 一次 fork 后的子进程 setsid,变成了一个无 tty 关联的 session leader。这里的另一个约定是,Daemon 绝对不会和特定的一个 tty 关联。
  • 两次 fork 后的孙子进程,直接变成了无 tty, 也不是 session leader 的孤儿进程,交由 init 托管。

衍生思考:我认为应该是操作系统没有提供比较通用的接口,导致应用层需要额外的通过 double-fork 技术使程序进入 daemon 模式。