【问题标题】:Why is STDIN_FILENO always zero?为什么 STDIN_FILENO 总是为零?
【发布时间】:2021-11-28 15:08:26
【问题描述】:

我想知道在 stdio 标头中将STDIN_FILENO 设置为0 是否有一个简单但合乎逻辑的原因,我在测试更复杂的代码时意识到了这一点,这是它的简短版本:

#include <unistd.h>
#include <stdio.h>


void main(char **argv)
{
    char *promt = "Not a terminal";
    int inter = 1;
    int counter = 1;
    isatty(STDIN_FILENO) == 0 ? inter = 0 : inter;
    while (TRUE)
    {
        inter == 1 ? write(1, promt, 16) : inter; 
        fflush(stdout);
        counter++;
        
    }

}

另外,如果可能的话,STDIN_FILENOStream 之间的关系是什么?

【问题讨论】:

  • 我不明白你的任何一个问题,而且你不应该一次问多个问题
  • Because the standard says so. 我不明白你关于Stream 的问题,这是你的问题中第一次也是唯一一次出现这个词,我不清楚它指的是什么。
  • 你是怎么想到void main(char **argv)的?我不知道你在做什么。
  • isatty 的参数是一个文件描述符。这可以是来自重定向文件或终端的流。终端有点特殊,所以它可以有自己的固定号码。
  • 为什么字母表的第一个字母总是A?为什么有时不是BZ

标签: c file-descriptor stdio tty


【解决方案1】:

STDIN_FILENO 是 POSIX,必须是 0

https://man7.org/linux/man-pages/man3/stdout.3.html

【讨论】:

  • 这并不能解释原因。
  • Stdin stdout 和 stderr 是 0 1 和 2 作为 posix 系统上的文件描述符。
  • 我不反对你。局部重力点靠近地球中心。但为什么?我的观点是这个问题在 SO 的有限范围内是无法回答的。你最好关闭它而不是发布这样的答案。
  • @MadPhysicist POSIX 将 STDIN_FILENO 定义为“始终为 0”。为什么还不够好?
  • @MadPhysicist 如果你想走“但为什么”的路线,永远没有答案。为什么标准输入为 0?因为它是这样定义的?但为什么?因为这就是posix标准定义它的方式。但为什么?因为人们是这么定义的。但为什么?因为他们认为将最有用的文件描述符从 0、1、2 开始是很方便的。但是为什么呢?因为他们能够做出如此合理的决定。但为什么?因为他们是有编程经验的聪明人。但为什么?因为他们对编程充满热情。但为什么呢?
【解决方案2】:

因为STDIN_FILENO定义为零per POSIX

此参考页面上描述的功能与 ISO C 标准。此处描述的要求之间的任何冲突 ISO C标准是无意的。本卷 POSIX.1-2017 遵循 ISO C 标准。 [选项结束]

具有关联缓冲的文件称为流,并声明为 是指向已定义类型 FILE 的指针。 fopen() 函数应创建 流的某些描述性数据并返回指向 在所有进一步的事务中指定流。通常情况下,有 在 中声明的三个带有常量指针的开放流 标头并与标准打开文件相关联。

在程序启动时,应预定义三个流,不需要 显式打开:标准输入(用于读取常规输入), 标准输出(用于写入常规输出)和标准错误 (用于写入诊断输出)。打开时,标准错误 流未完全缓冲;标准输入和标准输出 当且仅当可以确定流时,流才被完全缓冲 不是指交互式设备。

&lt;unistd.h&gt; 中的以下符号值定义文件 应与 C 语言 stdin 关联的描述符, stdoutstderr 应用程序启动时:

STDIN_FILENO

标准输入值,stdin其值为0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2018-09-19
    相关资源
    最近更新 更多