Comportamento estranho executando funções de biblioteca nos descritores de arquivo STDOUT e STDIN

Ao longo dos meus anos como programador em C, sempre fiquei confuso sobre os descritores de arquivo de fluxo padrão. Alguns lugares, como a Wikipedia[1]digamos:

Na linguagem de programação C, os fluxos de entrada, saída e erro padrão são anexados aos descritores de arquivos Unix existentes 0, 1 e 2, respectivamente.

Isso é feito porunistd.h:

/* Standard file descriptors.  */
#define STDIN_FILENO    0       /* Standard input.  */
#define STDOUT_FILENO   1       /* Standard output.  */
#define STDERR_FILENO   2       /* Standard error output.  */

No entanto, este código (em qualquer sistema):

write(0, "Hello, World!\n", 14);

Vai imprimirHello, World! (e uma nova linha) paraSTDOUT. Isso é estranho porqueSTDOUTO descritor de arquivo de 1 deve ser 1.write-ing no descritor de arquivo 1 também imprime emSTDOUT.

Executando umioctl no descritor de arquivo 0 altera a entrada padrão[2], e no descritor de arquivo 1 altera a saída padrão. No entanto, realizandotermios funções em 0 ou 1 altera a entrada padrão[3][4].

Estou muito confuso sobre o comportamento dos descritores de arquivo 1 e 0. Alguém sabe o porquê:

write1 ou 0 grava na saída padrão?Realizandoioctl on 1 modifica a saída padrão e on 0 modifica a entrada padrão, mas executandotcsetattr/tcgetattr em 1 ou 0 funciona para entrada padrão?

questionAnswers(2)

yourAnswerToTheQuestion