我在野外遇到了这样的代码,我想知道为什么这样做有效。
该代码从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);
}

最佳答案

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

当您通过管道传输内容时,情况已不再如此,并且此 splinter 的代码不再起作用,因为stdin现在是一回事,而stdout/stderr是另一回事。

在您的代码示例中,这样做是没有意义的,最好将其描述为错误。但是也许那个“狂野的代码”的作者试图做一些不同的事情,并且有这样做的理由。您是否为所找到的代码示例提供引用?

关于c - 从stderr而不是stdin读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46248477/

10-14 03:04