¿Cuál es la diferencia entre stdin y STDIN_FILENO?

¿Cuál es la diferencia práctica, si existe, entre stdin y STDIN_FILENO en C?

La interfaz. Como todos los demás han dicho, stdin es un FILE * tal como lo define la biblioteca c estándar. Puede usar algunas de las interfaces de nivel superior como fread , fwrite y fprintf . Por otro lado, STDIN_FILENO es solo un descriptor de archivos (casi con seguridad 0). Esto utiliza una interfaz de nivel inferior leve a través de los gustos de read y write .

stdin es un puntero de ARCHIVO predeterminado que se usa para obtener información de entrada que no sea estándar.

STDIN_FILENO es el número de descriptor de archivo de entrada estándar predeterminado, que es 0 . Es esencialmente una directiva definida para uso general.

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

Desde /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 definido en /usr/include/libio.h ) es una estructura de datos. STDIN_FILENO es una constante de macro, que apunta a un descriptor de archivo usado por el kernel.

 #include  #include  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; }