从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);
}
答
好问题!这是有效的,因为当你在终端的控制台时,STDIN,STDOUT和STDERR都指向相同的资源:/dev/tty
(或者你的平台调用它)。三个文件描述符是打开3次的相同文件(可能具有不同的选项)。
当你管道内容时,情况不再是这样了,这个破碎的代码不再起作用,因为stdin现在是一件事,而stdout/stderr是另一件事。
在您的代码示例中,这样做毫无意义,最好将其描述为一个错误。但也许这个“野外代码”的作者试图做一些不同的事情,并有他或她这样做的理由。你有找到你找到的代码示例的参考吗?
你的标题说,这是没有意义的\ – Dan