有充分的理由编写我自己的 daemonize 函数而不是使用 daemon(3) 吗?
网上有很多守护进程的示例实现。我看到的大多数不使用 daemon(3) 函数在后台运行程序。这只是一个品味、无知的问题,还是有充分的理由编写我自己的守护函数?使用 daemon(3) 有什么具体的缺点吗?是不是没有安全感?
There are a lot of example implementations of daemons on the net. Most that I saw do not use the daemon(3) function to run the program in the background. Is that just a matter of taste, ignorance, or is there a good reason to write my own daemonize function? Is there a specific disadvantage in using daemon(3)? Is it insecure?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
daemon() 函数历史上并非在所有版本的 Unix 中都可用,因此许多“可移植”代码不使用它。只要您关心的所有目标平台都有 daemon(),就真的没有理由推出自己的配方。
The daemon() function was not historically available in all flavors of Unix, so a lot of "portable" code doesn't use it. There's really no reason to roll your own recipe as long as all the target platforms you care about have daemon().
BSD daemon() 功能非常有限并且会导致误用。只有极少数守护进程可以正确使用此功能。
systemd 手册页列出了正确编写的 SysV 守护进程在守护进程时应执行的操作:
http ://0pointer.de/public/systemd-man/daemon.html
The BSD daemon() function is very limited and invites misuse. Only very few daemons may use this function correctly.
The systemd man pages have a list of what a correctly written SysV daemon should do when daemonizing:
http://0pointer.de/public/systemd-man/daemon.html
POSIX 中没有
daemon
函数。这是供应商扩展。因此,任何编写可移植代码的人都只需编写自己的代码。There is no
daemon
function in POSIX. It's a vendor extension. Thus anyone writing portable code simply writes their own.如果您不喜欢任何标准
daemon()
函数操作,您可以编写自己的函数操作。可以控制是否切换到根目录;您可以控制是否将标准 I/O 通道重新连接到 /dev/null。但是,如果您想让 stderr 对日志文件保持打开状态,同时将 stdin 和 stdout 重新连接到 /dev/null,您必须决定是否使用daemon()
以及适当的选项,后面跟上其他代码会更好而不是自己滚动。daemon()
中并没有太多复杂的东西;它调用fork()
和setsid()
(根据 Linux 版本;MacOS 版本提到在daemon()
运行时暂停 SIGHUP) 。查看标准资源以获取有关守护进程的更多信息 - 例如:W.理查德·史蒂文斯、比尔·芬纳、安德鲁·鲁道夫
UNIX® 网络编程,第 1 卷:套接字网络 API,第 3 版
Marc J Rochkind
高级 Unix 编程,第二版
If you don't like any of the standard
daemon()
function actions, you might write your own. You can control whether it switches to the root directory; you can control whether it reconnects the standard I/O channels to /dev/null. But if you want to keep stderr open to a log file, while reconnecting stdin and stdout to /dev/null, you have to decide whether to usedaemon()
with appropriate options followed by other code is better than rolling your own.There isn't much rocket science in
daemon()
; it callsfork()
andsetsid()
(according to the Linux version; the MacOS version mentions suspending SIGHUP whiledaemon()
is operating). Check out the standard resources for more information on daemonization — for example:W. Richard Stevens, Bill Fenner, Andrew M. Rudoff
UNIX® Network Programming, Vol 1: The Sockets Networking API, 3rd Edn
Marc J Rochkind
Advanced Unix Programming, 2nd Edn