调用daemon()和调用fork(),setsid(),fork()等有什么区别?

时间:2011-10-04 08:51:52

标签: c unix fork daemon

我一直在寻找创建Unixdæmons,似乎有两种方法。在搜索时似乎出现的冗长的一个是再次拨打fork()setsid()fork()chdir()到安全的地方,设置umask()最后,close() stdinstdoutstderr

然而,运行man daemon会显示有关daemon()函数的信息,该函数似乎与上面的内容完全相同。这两种方法之间是否有任何差异,或daemon()只是一个与冗长方法做同样事情的便利函数?是否有一个更好,特别是对于新手C程序员?

3 个答案:

答案 0 :(得分:20)

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

在使用glibc的Linux上,daemon只执行一个fork,可选chdir s(但仅限于/,您不能指定路径),不会触及{{1}并且不会关闭umask描述符(它可以选择将它们重新打开到std*)。 (source

所以它取决于平台,并且至少有一个实现比你做的要少。如果您需要所有正在做的事情,请坚持下去(或坚持/dev/null函数完全相同的平台。)

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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