从stderr而不是stdin读取

时间:2017-09-15 23:06:33

标签: c linux stdin stderr unistd.h

我在野外遇到了这样的代码,我想知道为什么会这样。 代码从stderr(fd == 2)而不是stdin(fd == 0)读取。奇怪的是这实际上有点起作用。您可以在控制台读取输入,但不能输入管道输入。知道这里发生了什么吗?

#include <stdio.h>
#include <unistd.h>
int main(){
   char buf[15];
   int nchars=read(2,buf,15);
   printf("%d '%s'\n",nchars,buf);
}

1 个答案:

答案 0 :(得分:5)

好问题!这是有效的,因为当您在终端的控制台时,STDIN,STDOUT和STDERR最终都指向相同的资源:/dev/tty(或您的平台所称的任何资源)。三个文件描述符是相同的文件打开3次(可能有不同的选项)。

管道内容时,不再是这种情况,这个破坏的代码不再有效,因为stdin现在是一件事,而stdout / stderr则是另一件事。

在您的代码示例中,这样做没有任何意义,最好将其描述为错误。但也许那个&#34;代码的作者在野外&#34;我试图做一些与众不同的事情,并且有这样的理由。您是否找到了您找到的代码示例的参考资料?