Os chamados "streams padrão" no Linux são stdin,stdout,stderr. Mas eles devem ser chamados de "padrão" por um motivo. Existem streams fora do padrão? E esses fluxos não padronizados são fundamentalmente tratados de maneira diferente pelo kernel?
relate perguntas
-
Problema com a contagem de manipulações de arquivos em todo o sistema
-
O que acontece com os descritores de arquivo quando o processo é encerrado?
-
Não é possível fazer o bash flock funcionar
-
Compartilhamento de descritores de arquivo
-
Por que os descritores de arquivo são compartilhados entre processos bifurcados?
Nesse contexto, um “stream” é um arquivo aberto em um processo. (A palavra “stream” pode ter outros significados fora do tópico aqui.)
Os três fluxos padrão são aqueles que deveriam estar abertos quando um programa é iniciado. O descritor de arquivo 0 é chamado de entrada padrão porque é onde um programa deve ler a entrada do usuário ou sua entrada de dados padrão. O descritor de arquivo 1 é chamado de saída padrão porque é onde um programa deve escrever sua saída de dados normal. O descritor de arquivo 2 é chamado de erro padrão porque é onde um programa deve escrever suas mensagens de erro.
Outros números de descritores de arquivo não são padrão porque não possuem uma função pré-atribuída. Eles vão acabar sendo usados para o que o programa quiser. Então, poderia chamar qualquer arquivo aberto por um programa de “stream não padrão”, mas seria estranho e confuso: “abrir arquivo diferente de stdin, stdout ou stderr” não precisa realmente de um nome, e “stream não padrão” soa como se fosse algum tipo especial de arquivo ou um arquivo aberto por um método não padrão, o que não é o caso.
A função convencional dos descritores de arquivo 0–2 é concedida pela biblioteca padrão e por determinados programas. Por exemplo, programas de login de console e emuladores de terminal iniciam o shell (ou outro programa) com o terminal aberto nesses descritores de arquivo. A biblioteca padrão C cria
FILE*
objetos (o que C chama de fluxos) para esses três descritores padrão. Não há tratamento especial no kernel.O kernel trata todos os descritores de arquivo da mesma maneira. É apenas uma convenção ter processos que usam 0 como entrada (stdin), 1 como saída (stdout) e erros de impressão em 2 (stderr).
Quando seu terminal for iniciado, ele criará um pseudo-tty e iniciará um shell com entradas/saídas em descritores de arquivo 0,1,2. Então, se o seu programa não usar essa convenção, você terá que redirecionar adequadamente as entradas ou saídas.