【问题标题】:Reading from stderr instead of stdin从 stderr 而不是 stdin 读取
【发布时间】:2017-09-15 23:06:32
【问题描述】:

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

【问题讨论】:

  • 你的标题说“从 stderr 而不是 stderr 读取”这没有意义\

标签: c linux stdin stderr unistd.h


【解决方案1】:

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多