2017-03-10 80 views
0

我明白,一个守护进程不应该写stdout(和stderr),因为这不会是一次可从控制终端分离。但是,我可以重新打开stdout到一个普通的文件,这样我所有的原始日志仍然可以工作吗?这对我来说是非常好的和有用的。重新打开标准输出到Linux守护进程的常规文件?

我想是这样的分叉后,

freopen("/dev/null/", "r", stdin); 
freopen("log", "w", stdout); 
freopen("log", "w", stderr); 

BOOST_LOG_TRIVIAL(info) << "daemonized!"; 

守护程序可以启动(准确地说,它并没有失败,退出),并可以创建日志文件。但是日志是空的(没有“守护进程!”)。这是不是正确的方法来守护?有人可以点亮一些光线吗?

+0

我认为你有理由回到前面 - 如果你的'stdout'和/或'stderr'去一个终端,那么它仍然是你的控制终端,你不能脱离它。我错了吗? –

回答

0

有一个库函数daemon(int nochdir, int noclose),可用于帮助代码适当地守护进程并重新打开连接到/dev/null的标准I/O流。使用它和一个系统日志工具(如syslog)将是我作为一个“正确”的方式进行守护的方式。

使标准I/O流打开并与/dev/null相关联可以避免任何由于任何剩余I/O而造成的打嗝(这可能会阻止进程或导致意外的信号)。它会另外阻止任何新的描述从懵懵懂懂获取这些不知不觉正从说遗留printf报表输出。

至于标准I关联/ O与常规文件流,在网上daemonize program手册页以下警告似乎认识到有用:

小心你输出重定向!包含了打开的文件的文件系统不能只要文件被打开被卸载。为了达到最佳效果,请确保此输出文件是相同的文件系统守护进程的工作目录上。