【问题标题】:What's the difference between calling daemon() and calling fork(), setsid(), fork(), etc.?调用 daemon() 和调用 fork()、setsid()、fork() 等有什么区别?
【发布时间】:2011-11-30 12:23:56
【问题描述】:

我一直在研究创建 Unix 守护进程,似乎有两种方法。搜索时似乎出现的冗长的方法是再次调用fork()setsid()fork()chdir() 到安全的地方,设置umask(),最后,close()stdinstdoutstderr

但是,运行 man daemon 会显示有关 daemon() 函数的信息,它似乎做的所有事情都与上述相同。这两种方法之间是否有任何区别,或者daemon() 只是一个与冗长方法做同样事情的便利功能?哪一个更好,尤其是对于新手 C 程序员?

【问题讨论】:

    标签: c unix fork daemon


    【解决方案1】:

    守护进程调用总结了冗长的 fork 过程,我不记得有任何实现更多功能。

    由于 daemon() 是一个高级概念,它绝对是新手和有经验的程序员的首选。

    【讨论】:

      【解决方案2】:

      daemon 函数未在 POSIX 中定义,因此其实现(如果有)在不同平台上的行为可能不同。

      在带有 glibc 的 Linux 上,daemon 只做一个 fork,可选 chdirs(但仅限于 /,你不能指定路径),不接触 umask,并且不关闭std* 描述符(它可以选择将它们重新打开到 /dev/null)。 (source)

      所以这取决于平台,并且至少有一个实现比你做的少。如果您需要您正在做的所有事情,请坚持下去(或坚持使用daemon 函数完全可以做到这一点的平台)。

      【讨论】:

      • 将文件描述符 0、1 和 2 打开到 /dev/null 比关闭它们更好,因为否则您的守护程序打开的下一个文件(日志文件、套接字等)将获得这些文件描述符- 这可能会咬你,比如当你调用的某个库决定向stderr写一个错误时...
      • 很好地呼吁不要关闭描述符 0、1 和 2。
      【解决方案3】:

      请注意,daemon 不符合任何标准。更好地使用符合标准的函数(如 POSIX 定义的 forksetsid)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-14
        • 2011-02-06
        • 2012-08-02
        • 2010-09-23
        • 1970-01-01
        • 1970-01-01
        • 2015-03-30
        • 1970-01-01
        相关资源
        最近更新 更多