调用守护进程()和调用fork(),setsid(),fork()等有什么区别?
问题描述:
我一直在寻找创建Unix守护进程,似乎有两种方法。在啰嗦一句,这似乎拿出搜索时,为再次调用fork()
,setsid()
,fork()
,chdir()
到安全的地方,设置umask()
,最后close()
stdin
,stdout
和stderr
。调用守护进程()和调用fork(),setsid(),fork()等有什么区别?
但是,运行man daemon
会提示有关daemon()
函数的信息,这似乎与上面所做的内容完全相同。这两种方法之间有什么不同吗?或者daemon()
只是一个方便的功能,它和冗长的方法做同样的事情?是一个更好的,特别是对于新手C程序员?
答
daemon
函数没有在POSIX中定义,所以它的实现(如果有的话)可能在不同的平台上有不同的表现。
在Linux上用glibc,daemon
只做一个叉,可选chdir
S(但仅限于/
,你不能指定路径),不触及umask
,并且不关闭std*
描述符(它可选择重新打开它们到/dev/null
虽然)。 (source)
所以它取决于平台,并且至少有一个实现比你做的少。如果你需要所有你正在做的事情,坚持下去(或者坚持一个平台,daemon
函数就是这样做的)。
答
守护进程调用总结了冗长的fork过程,我不记得任何可以做更多事情的实现。
由于daemon()是一个高级概念,所以对于初学者和有经验的程序员来说,它绝对是首选。
答
请注意daemon
不符合任何标准。更好地使用符合标准的功能(如POSIX定义的fork
和setsid
)。
将文件描述符0,1和2打开到'/ dev/null'比关闭它们要好,因为否则守护程序打开的下一个文件(日志文件,套接字,...)将获得这些文件描述符 - 可能会咬你,说当你打电话的某个库决定写一个错误到'stderr' ... – caf
好的调用不关闭描述符0,1和2。 –