【问题标题】:What is the difference between stdin and STDIN_FILENO?stdin 和 STDIN_FILENO 有什么区别?
【发布时间】:2013-02-27 02:13:20
【问题描述】:

C 中 stdinSTDIN_FILENO 之间的实际区别是什么?

【问题讨论】:

标签: c


【解决方案1】:

界面。正如其他人所说,stdin 是标准 c 库定义的FILE *。您可以使用一些更高级别的接口,例如freadfwritefprintf。另一方面,STDIN_FILENO 只是一个文件描述符(几乎可以肯定是 0)。这通过readwrite 之类的方式使用了一个稍低级别的接口。

【讨论】:

  • 没有一个答案提到STDIN_FILENO<unistd.h> 中定义的宏。至少对于一个 POSIX 兼容的系统,它不仅仅是“几乎可以肯定 0”;必须定义为 0。同样STDOUT_FILENO 为 1,STDERR_FILENO 为 2。
  • <unistd.h> 标头 [...] 和两个常量 STDIN_FILENOSTDOUT_FILENO 是 POSIX 标准 [...] 的一部分。此标头包含许多 UNIX 系统服务的函数原型,例如我们调用的 readwrite 函数。常量STDIN_FILENOSTDOUT_FILENO<unistd.h> 中定义,并指定标准输入和标准输出的文件描述符。根据 POSIX.1 的要求,这些值分别是 01,但为了便于阅读,我们将使用这些名称。 -- 来源:Unix® 环境中的高级编程 - 第 2 版第 9 页
【解决方案2】:

stdin 是一个默认的 FILE 指针,用于从标准输入中获取输入。

STDIN_FILENO 是默认的标准输入文件描述符编号,即0。它本质上是一个已定义的通用指令。

【讨论】:

    【解决方案3】:

    来自/usr/include/stdio.h

    /* Standard streams.  */
    extern struct _IO_FILE *stdin;          /* Standard input stream.  */
    extern struct _IO_FILE *stdout;         /* Standard output stream.  */
    extern struct _IO_FILE *stderr;         /* Standard error output stream.  */
    /* C89/C99 say they're macros.  Make them happy.  */
    #define stdin stdin
    #define stdout stdout
    #define stderr stderr
    

    来自/usr/include/unistd.h

    /* Standard file descriptors.  */
    #define STDIN_FILENO    0       /* Standard input.  */
    #define STDOUT_FILENO   1       /* Standard output.  */
    #define STDERR_FILENO   2       /* Standard error output.  */
    

    例如,stdin_IO_FILE定义在/usr/include/libio.h)是一个结构数据。 STDIN_FILENO 是一个宏常量,它指向内核使用的文件描述符。

    #include <stdio.h>
    #include <unistd.h>
    
    void
    stdin_VS_STDIN_FILENO(void)
    {
        printf("stdin->_flags = %hd\n", stdin->_flags);
        printf("STDIN_FILENO  : %d\n", STDIN_FILENO);
    }
    
    int
    main(void)
    {
        stdin_VS_STDIN_FILENO();
        return 0;
    }
    

    【讨论】:

      【解决方案4】:

      stdin : 1. 文件指针 (* FILE) 2.文件描述符表保存进程时的地址 创建的。 3. 存在于/usr/include/stdio.h

      STDIN_FILENO : 1. 它是一个宏 2. 它只不过是文件描述符表的数组索引 (默认为 0)。 3.存在于/usr/include/unistd.h

      可以通过以下代码更清楚。

      #include<stdio.h> 
      #include<unistd.h> 
      int main() 
      {    
           printf("%d\t\t%p ----- ",STDIN_FILENO,stdin);
      
      return 0; 
      } 
      

      【讨论】:

        【解决方案5】:

        Linux 标头#include "unistd.h" 中的 STDIN_FILENO 只是 0 的宏,当您使用 Linux 管道时,它代表管道的标准输入。

        【讨论】:

          猜你喜欢
          • 2011-05-15
          • 2016-03-20
          • 1970-01-01
          • 1970-01-01
          • 2010-10-02
          • 2011-12-12
          • 2010-09-16
          • 2012-03-14
          • 2012-02-06
          相关资源
          最近更新 更多