What is the difference between stdin and STDIN_FILENO?

后端 未结 4 2003
悲&欢浪女
悲&欢浪女 2020-12-24 00:58

What is the practical difference, if any, between stdin and STDIN_FILENO in C?

相关标签:
4条回答
  • 2020-12-24 01:40

    stdin : 1. A file pointer (* FILE) 2. The file descriptor table holds its address when process is created. 3. present in /usr/include/stdio.h

    STDIN_FILENO : 1. It is a macro 2. Its nothing but an array index of a file descriptor table (default 0). 3.present in /usr/include/unistd.h

    Could be more clear by following code.

    #include<stdio.h> 
    #include<unistd.h> 
    int main() 
    {    
         printf("%d\t\t%p ----- ",STDIN_FILENO,stdin);
    
    return 0; 
    } 
    
    0 讨论(0)
  • 2020-12-24 01:43

    stdin is a default FILE pointer used to get input from none other than standard in.

    STDIN_FILENO is the default standard input file descriptor number which is 0. It is essentially a defined directive for general use.

    0 讨论(0)
  • 2020-12-24 01:43

    From /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
    

    From /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.  */
    

    Ex, stdin (_IO_FILE defined in /usr/include/libio.h) is a structure data. STDIN_FILENO is a macro constant, which points to a file descriptor used by kernel.

    #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;
    }
    
    0 讨论(0)
  • 2020-12-24 01:53

    The interface. Like everyone else has said, stdin is a FILE * as defined by the standard c library. You can use some of the higher level interfaces like fread, fwrite, and fprintf. On the other hand, STDIN_FILENO is just a file descriptor (almost certainly 0). This uses a slight lower level interface through the likes of read and write.

    0 讨论(0)
提交回复
热议问题