linux:从终端分离后,将标准输出关闭或重定向到/ dev / null

时间:2015-10-21 19:23:40

标签: c linux terminal daemon 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);

目前,我对使用的方法有点困惑:重定向还是关闭?每种方法的潜在问题是什么?

1 个答案:

答案 0 :(得分:6)

您可以这样做,但重定向到/dev/null会更安全,更轻松。

如果选择关闭,则必须确保在stdin / stdout / stderr关闭时,您调用的任何外部程序或库仍然有效。图书馆和框架的处理方式不同:

  • 由于echo意外返回不成功,因此Shell脚本可能会中止或行为不当。
  • 当编写底层缓冲区时,Python程序会看到任意打印语句失败并出现异常。
  • Ruby会忽略它。

即使您调用的程序或库通常不打印任何内容,您也不知道它们执行了哪种条件记录以及它们如何处理那里的故障。

除非您运行的所有代码都知道没有标准的i / o,否则最好只重定向。