¿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; }