4

网上有很多守护进程的示例实现。我看到的大多数不使用 daemon(3) 函数在后台运行程序。这只是品味、无知的问题,还是有充分的理由编写我自己的守护进程函数?使用 daemon(3) 有什么特别的缺点吗?它不安全吗?

4

4 回答 4

5

daemon() 函数在历史上并非在所有版本的 Unix 中都可用,因此许多“可移植”代码不使用它。只要您关心的所有目标平台都有 daemon(),就真的没有理由推出自己的食谱。

于 2010-09-15T18:20:58.293 回答
3

POSIX中没有daemon函数。这是一个供应商扩展。因此,任何编写可移植代码的人都只需编写自己的代码。

于 2010-09-15T21:31:42.357 回答
3

BSD daemon() 函数非常有限并且容易被滥用。只有极少数守护进程可以正确使用此功能。

systemd 手册页列出了正确编写的 SysV 守护程序在守护进程时应执行的操作:

http://0pointer.de/public/systemd-man/daemon.html

于 2010-09-15T21:09:28.337 回答
2

如果您不喜欢任何标准daemon()功能操作,您可以自己编写。可以控制是否切换到根目录;您可以控制它是否将标准 I/O 通道重新连接到 /dev/null。但是,如果您想保持 stderr 对日志文件保持打开状态,同时将 stdin 和 stdout 重新连接到 /dev/null,您必须决定是否使用daemon()适当的选项,然后使用其他代码比滚动您自己的代码更好。

没有太多的火箭科学daemon();它调用fork()and setsid()(根据 Linux 版本;MacOS 版本提到在daemon()运行时暂停 SIGHUP)。查看标准资源以获取有关守护进程的更多信息——例如:

于 2010-09-15T18:51:41.537 回答