重新打开stdout到linux守护进程的常规文件?

时间:2017-03-10 03:37:22

标签: linux fork stdout daemon freopen

我知道守护进程不应该写入stdout(和stderr),因为一旦从控制终端分离就不可用。但是我可以将stdout重新打开到常规文件中,以便我的所有原始日志记录仍然有用吗?这对我来说非常好用。

我在分叉后尝试了类似的东西,

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

BOOST_LOG_TRIVIAL(info) << "daemonized!";

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

1 个答案:

答案 0 :(得分:0)

有一个库函数daemon(int nochdir, int noclose),可用于帮助代码进行适当的守护,并另外重新打开连接到/dev/null的标准I / O流。使用它和系统日志工具(如syslog)将成为我在&#34;权利&#34;之前的方式。守护的方式。

打开标准I / O流并与/dev/null关联将提供避免由于任何遗留I / O导致的任何打扰(例如可能阻止进程或导致意外)的好处信号)。它还可以防止任何新的描述符毫无疑问地获取它们,并且无意中从左侧printf语句中获得输出。

就将标准I / O流与常规文件相关联,在线daemonize program手册页中的以下警告似乎有助于识别:

  

在重定向输出时要小心!只要文件处于打开状态,就无法卸载包含打开文件的文件系统。为获得最佳结果,请确保此输出文件与守护程序的工作目录位于同一文件系统上。