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 porqueSTDOUTSe 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é:

writeing 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?

Respuestas a la pregunta(2)

Su respuesta a la pregunta