【发布时间】:2011-04-12 20:04:07
【问题描述】:
网络上有很多守护进程的示例实现。我看到的大多数不使用 daemon(3) 函数在后台运行程序。这只是品味、无知的问题,还是有充分的理由编写我自己的守护进程函数?使用 daemon(3) 有什么特别的缺点吗?不安全吗?
【问题讨论】:
网络上有很多守护进程的示例实现。我看到的大多数不使用 daemon(3) 函数在后台运行程序。这只是品味、无知的问题,还是有充分的理由编写我自己的守护进程函数?使用 daemon(3) 有什么特别的缺点吗?不安全吗?
【问题讨论】:
daemon() 函数在历史上并非在所有版本的 Unix 中都可用,因此许多“可移植”代码不使用它。只要您关心的所有目标平台都有 daemon(),就没有理由推出自己的配方。
【讨论】:
如果您不喜欢任何标准的daemon() 函数操作,您可以自己编写。可以控制是否切换到根目录;您可以控制它是否将标准 I/O 通道重新连接到 /dev/null。但是如果你想让 stderr 保持对日志文件的开放,同时将 stdin 和 stdout 重新连接到 /dev/null,你必须决定是否使用 daemon() 和适当的选项,然后是其他代码比滚动你自己的代码更好。
daemon() 中没有太多火箭科学;它调用fork() 和setsid()(根据Linux 版本;MacOS 版本提到在daemon() 运行时暂停SIGHUP)。查看标准资源以获取有关守护进程的更多信息——例如:
W.理查德·史蒂文斯、比尔·芬纳、安德鲁·M·鲁道夫 UNIX® Network Programming, Vol 1: The Sockets Networking API, 3rd Edn
马克·J·罗奇金德 Advanced Unix Programming, 2nd Edn
【讨论】:
BSD daemon() 函数非常有限并且容易被滥用。只有极少数守护进程可以正确使用此功能。
systemd 手册页列出了正确编写的 SysV 守护程序在守护进程时应执行的操作:
【讨论】:
POSIX 中没有daemon 函数。这是一个供应商扩展。因此,任何编写可移植代码的人都只需编写自己的代码。
【讨论】: