Comportamiento extraño que realiza funciones de biblioteca en STDOUT y los descriptores de archivo de STDIN
A lo largo de mis años como programador en C, siempre me han confundido los descriptores de archivos de flujo estándar. Algunos lugares, como Wikipedia[1]decir:
En el lenguaje de programación C, los flujos de entrada, salida y error estándar se adjuntan a los descriptores de archivo Unix existentes 0, 1 y 2, respectivamente.
Esto está respaldado porunistd.h
:
/* Standard file descriptors. */
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
#define STDERR_FILENO 2 /* Standard error output. */
Sin embargo, este código (en cualquier sistema):
write(0, "Hello, World!\n", 14);
ImprimiráHello, World!
(y una nueva línea) aSTDOUT
. Esto es extraño porqueSTDOUT
Se supone que el descriptor de archivo es 1.write
-ing al descriptor de archivo 1 también se imprime enSTDOUT
.
Realizar unioctl
en el descriptor de archivo 0 cambia la entrada estándar[2], y en el descriptor de archivo 1 cambia la salida estándar. Sin embargo, realizandotermios
funciones en 0 o 1 cambia la entrada estándar[3][4].
Estoy muy confundido sobre el comportamiento de los descriptores de archivo 1 y 0. ¿Alguien sabe por qué:
write
ing a 1 o 0 escribe en la salida estándar?Ejecutandoioctl
en 1 modifica la salida estándar y en 0 modifica la entrada estándar, pero realizandotcsetattr
/tcgetattr
en 1 o 0 funciona para entrada estándar?