从stderr而不是stdin读取

问题描述:

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

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

你的标题说,这是没有意义的\ – Dan

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

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

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

+0

“从标准错误,而不是stderr读”代码是在这里:https://github.com/riscv/riscv-isa-sim/blob/8969a855132a27769dd6399566dc86ac32b26e76/riscv/interactive.cc #L82我认为它是一个错误 – vanjoe

+0

实际上,对于我在该回购协议中提出的问题,其实只有一个答案:https://github.com/riscv/riscv-isa-sim/issues/124#issuecomment-329922070。看起来这是故意的。 – vanjoe