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 porqueSTDOUT
O 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ê:
write
1 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?