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

Sco*_*ott 11 c unix fork daemon

我一直在寻找创建Unixdæmons,似乎有两种方法.在啰嗦一句,这似乎拿出搜索时是调用fork(),setsid(),fork()再次chdir()到安全的地方,设置umask(),最后close() stdin,stdoutstderr.

man daemon然而,运行会提供有关daemon()函数的信息,这似乎与上面的内容完全相同.这两种方法之间是否存在差异,或者daemon()只是一种与冗长方法相同的便利函数?是否更好,特别是对于新手C程序员?

Mat*_*Mat 20

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

在使用glibc的Linux上,daemon只有一个fork,可选地chdirs(但只能/,你不能指定路径),不接触umask,并且不关闭std*描述符(/dev/null尽管它可选地重新打开它们).(来源)

所以这取决于平台,至少有一个实现比你做的少.如果您需要所有正在做的事情,请坚持下去(或坚持使用daemon功能完全正确的平台).

  • 将文件描述符0,1和2保留为"/ dev/null"比关闭它们更可取,因为否则你的守护进程打开的下一个文件(日志文件,套接字......)将获得那些文件描述符 - 这可能会让你感到厌烦,当你正在调用的某个库决定向`stderr`写错误时...... (10认同)