c - 从 stderr 而不是 stdin 读取

标签 c linux stdin stderr unistd.h

我在野外遇到了这样的代码,我想知道为什么它会起作用。 该代码从 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次(可能使用不同的选项)。

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

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

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

相关文章:

C - 创建/写入/读取命名管道

c - 在C中访问数组的连续条目

linux - 找不到 `jobs` 命令列出的进程

php - 如何将 Symfony 命令作为 cron 作业执行?

linux - 使用 sed 在文件中插入一些文本

character - perl6 如何重新打开 $*IN 进行输入?

c - 如何在命令提示符下通过 C 文件运行输入 txt 文件到输出 txt 文件?

python - 如何遍历命令行上传递的所有文件行?

C - MSVS 2013 "C2374: ' 名称': redefinition, 多重初始化”- 为什么?

c - "int b = (int) 45.0"和 "int b = 45.0"和有什么区别?