有充分的理由编写我自己的 daemonize 函数而不是使用 daemon(3) 吗?

发布于 2024-09-24 05:33:04 字数 118 浏览 21 评论 0原文

网上有很多守护进程的示例实现。我看到的大多数不使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

萌无敌 2024-10-01 05:33:04

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().

断爱 2024-10-01 05:33:04

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

挖鼻大婶 2024-10-01 05:33:04

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

There is no daemon function in POSIX. It's a vendor extension. Thus anyone writing portable code simply writes their own.

極樂鬼 2024-10-01 05:33:04

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

daemon() 中并没有太多复杂的东西;它调用 fork()setsid() (根据 Linux 版本;MacOS 版本提到在 daemon() 运行时暂停 SIGHUP) 。查看标准资源以获取有关守护进程的更多信息 - 例如:

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 use daemon() with appropriate options followed by other code is better than rolling your own.

There isn't much rocket science in daemon(); it calls fork() and setsid() (according to the Linux version; the MacOS version mentions suspending SIGHUP while daemon() is operating). Check out the standard resources for more information on daemonization — for example:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文