在Stevens的UNIX网络编程中,他提到重定向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);
我很困惑这三个'知道'他们是如何重定向三个标准*。特别是因为最后两个命令是相同的。有人可以解释或指出我正确的方向吗?
答案 0 :(得分:15)
当执行此代码时,可能已经关闭了文件描述符0,1和2,并且没有其他线程可能正在分配新的文件描述符。在这种情况下,由于open
始终需要始终分配最低可用文件描述符编号,因此这三个打开调用将生成文件描述符0,1和2,除非它们失败。
答案 1 :(得分:4)
这是因为文件描述符0,1和2分别是输入,输出和错误,而open将获取可用的第一个文件描述符。请注意,这仅在文件描述符0,1和2尚未使用时才有效。
您应该注意使用的术语,stdin
,stdout
和stderr
实际上是文件句柄(FILE*
)而不是文件描述符,尽管有一个这些与文件描述符之间的相关性。