【问题标题】:Redirecting STDIN, STDOUT, STDERR to /dev/null in C在 C 中将 STDIN、STDOUT、STDERR 重定向到 /dev/null
【发布时间】:2025-12-29 11:15:15
【问题描述】:

在 Stevens 的 UNIX Network Programming 中,他提到了重定向 stdin、stdout 和 stderr,这是设置守护程序时需要的。他用下面的 C 代码来做

/* redirect stdin, stdout, and stderr to /dev/null */
open("/dev/null", O_RDONLY);
open("/dev/null", O_RDWR);
open("/dev/null", O_RDWR);

我很困惑这三个“知道”他们如何重定向三个 std*。特别是因为最后两个命令是相同的。有人可以解释或指出正确的方向吗?

【问题讨论】:

  • Tch。这样做很危险。始终使用dup2()
  • 如果你的进程是单线程的并且你已经关闭了旧的stdin/out/err,这并不危险。
  • 这个答案可能会有所帮助:*.com/a/4973065/207753
  • 请不要这样做。我知道这是一个有 5 年历史的问题,但早在 2003 年就已经指出,将标准输入、标准输出和标准错误重定向到 /dev/null 会引起很多系统管理员的头痛。 cloud9.hedgee.com./scribbles/daemon#logging

标签: c redirect stdout stdin


【解决方案1】:

可能在执行此代码时文件描述符 0、1 和 2 已经关闭,并且没有其他线程可能正在分配新的文件描述符。在这种情况下,由于open 需要始终分配最低的可用文件描述符编号,因此这三个打开调用将产生文件描述符 0、1 和 2,除非它们失败。

【讨论】:

  • 他选择O_RDWR而不是O_WRONLY有什么原因?
  • 因为文件描述符的顺序是stdin、stdout、stderr。当然,标准输入是只读的。
  • 当然可以打开stdout和stderr O_WRONLY,但我认为这并不重要...
  • 你是对的,所有文件描述符在我提供的代码之前都已关闭。谢谢,这很有意义。
【解决方案2】:

这是因为文件描述符 0、1 和 2 分别是输入、输出和错误,而 open 会抓取第一个可用的文件描述符。请注意,这仅在文件描述符 0、1 和 2 未被使用时才有效。

您应该小心使用的术语,stdinstdoutstderr 实际上是文件句柄 (FILE*) 而不是文件描述符,尽管它们与文件描述符之间存在关联。

【讨论】: