【问题标题】:Is there a good reason to write my own daemonize function instead of using daemon(3)?是否有充分的理由编写我自己的 daemonize 函数而不是使用 daemon(3)?
【发布时间】:2011-04-12 20:04:07
【问题描述】:

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

【问题讨论】:

    标签: c linux unix daemon bsd


    【解决方案1】:

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

    【讨论】:

    • 不仅仅是历史上的;它从未被标准化,也没有标准行为。每个供应商的可能不同,也可能根本不存在。最好不要使用它。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2011-03-24
          • 2013-06-04
          • 2018-02-11
          • 2012-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-16
          相关资源
          最近更新 更多