0

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

我在分叉后尝试了这样的事情,

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

BOOST_LOG_TRIVIAL(info) << "daemonized!";

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

4

1 回答 1

0

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

让标准 I/O 流打开并与之关联/dev/null将提供避免由于这些 I/O 的任何剩余 I/O 引起的任何打嗝的好处(例如,这可能会阻塞进程或导致意外信号)。它还可以防止任何新的描述符在不知情的情况下获取它们并在不知情的情况下从say left over printfstatements 中获取输出。

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

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

于 2017-03-14T02:19:39.197 回答