网上有许多守护进程的示例实现。我看到的大多数都不使用守护进程(3)函数在后台运行程序。这只是一个品味,无知的问题,还是有充分的理由来编写我自己的守护进程功能?使用守护进程(3)有特定的缺点吗?它不安全吗?
答案 0 :(得分:5)
daemon()函数在各种Unix版本中都没有历史可用,所以很多“可移植”代码都不使用它。只要您关心的所有目标平台都有守护进程(),就没有理由推出自己的配方。
答案 1 :(得分:3)
BSD守护程序()函数非常有限,并且会导致滥用。只有极少数守护进程可以正确使用此功能。
systemd手册页有一个正确编写的SysV守护程序在守护进程时应该做什么的列表:
答案 2 :(得分:3)
POSIX中没有daemon
功能。这是供应商扩展。因此,编写可移植代码的人只需编写自己的代码。
答案 3 :(得分:2)
如果您不喜欢任何标准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
Marc J Rochkind Advanced Unix Programming, 2nd Edn