2011-10-04 93 views
10

我一直在寻找创建Unix守护进程,似乎有两种方法。在啰嗦一句,这似乎拿出搜索时,为再次调用fork()setsid()fork()chdir()到安全的地方,设置umask(),最后close()stdinstdoutstderr调用守护进程()和调用fork(),setsid(),fork()等有什么区别?

但是,运行man daemon会提示有关daemon()函数的信息,这似乎与上面所做的内容完全相同。这两种方法之间有什么不同吗?或者daemon()只是一个方便的功能,它和冗长的方法做同样的事情?是一个更好的,特别是对于新手C程序员?

回答

19

daemon函数没有在POSIX中定义,所以它的实现(如果有的话)可能在不同的平台上有不同的表现。

在Linux上用glibc,daemon只做一个叉,可选chdir S(但仅限于/,你不能指定路径),不触及umask,并且不关闭std*描述符(它可选择重新打开它们到/dev/null虽然)。 (source

所以它取决于平台,并且至少有一个实现比你做的少。如果你需要所有你正在做的事情,坚持下去(或者坚持一个平台,daemon函数就是这样做的)。

+10

将文件描述符0,1和2打开​​到'/ dev/null'比关闭它们要好,因为否则守护程序打开的下一个文件(日志文件,套接字,...)将获得这些文件描述符 - 可能会咬你,说当你打电话的某个库决定写一个错误到'stderr' ... – caf

+0

好的调用不关闭描述符0,1和2。 –

1

守护进程调用总结了冗长的fork过程,我不记得任何可以做更多事情的实现。

由于daemon()是一个高级概念,所以对于初学者和有经验的程序员来说,它绝对是首选。

2

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