从stderr而不是stdin读取

我在野外遇到这样的代码,我想知道为什么这个工作。 代码从stderr(fd == 2)读取而不是stdin(fd == 0)。 奇怪的是这实际上有点作用。 您可以阅读在控制台input,但不是pipe道input。 有什么想法发生在这里?

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

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

当你管内容时,不再是这种情况,这个破碎的代码不再起作用,因为stdin现在是一个东西,而stdout / stderr是另一个。

在你的代码示例中,这样做是没有意义的,最好的描述是一个错误。 但也许这个“野性的代码”的作者试图做一些不同的事情,并有他或她这样做的理由。 你有没有参考你找到的代码示例?