C - Linux:在从终端分离后关闭或重定向标准输出到/dev/null



我们有一个linux代码,可以根据http://www.itp.uzh.ch/~dpotter/howto/daemonize上的实现从终端分离。

下面是其中的代码片段:

....
freopen( "/dev/null", "r", stdin);
freopen( "/dev/null", "w", stdout);
freopen( "/dev/null", "w", stderr);
kill( parent, SIGUSR1 );
}

不需要重定向到/dev/null,我可以通过以下方式关闭标准文件描述符并获得相同的结果:

close(STDIN_FILENO);     
close(STDOUT_FILENO); 
close(STDERR_FILENO);

现在,我有点纠结于使用什么方法:重定向还是关闭?每种方法的潜在问题是什么?

您可以这样做,但重定向到/dev/null更安全,更容易。

如果您选择关闭,您必须确保当stdin/stdout/stderr关闭时,您调用的任何外部程序或库仍然可以工作。库和框架的处理方式不同:

  • Shell脚本可能会因为echo意外返回非成功而中止或行为错误。
  • Python程序在写入底层缓冲区时将看到任意打印语句失败并出现异常。
  • Ruby会忽略它。

即使你调用的程序或库通常不打印任何东西,你也不知道它们做了什么样的条件日志记录,以及它们是如何处理故障的。

除非您运行的所有代码都知道处理不具有标准i/o,否则最好直接重定向。

最新更新