Existem fluxos "não padrão" no Linux/Unix?

Existem fluxos "não padrão" no Linux/Unix?

Os chamados “streams padrão” no Linux são stdin, stdout e stderr. Eles devem ser chamados de “padrão” por um motivo. Existem fluxos fora do padrão? Esses fluxos não padronizados são fundamentalmente tratados de maneira diferente pelo kernel?

Responder1

Neste contexto, um “stream” é um arquivo aberto em um processo. (A palavra “stream” pode ter outros significados que estão fora do assunto aqui.)

Os três fluxos padrão são aqueles que já 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 gravar sua saída normal de dados. 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 têm uma função pré-atribuída. Eles acabarão sendo usados ​​para o que o programa quiser. Então, poderia chamar qualquer arquivo aberto por um programa de “stream fora do padrão”, mas seria estranho e confuso: “arquivo aberto diferente de stdin, stdout ou stderr” realmente não precisa de um nome, e “stream fora do padrão” soa como se fosse algum tipo especial de arquivo ou 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.

Responder2

O kernel trata todos os descritores de arquivo da mesma maneira. É apenas uma convenção ter processos que usam o descritor de arquivo 0 como entrada (stdin), o descritor de arquivo 1 como saída (stdout) e imprimem erros no descritor de arquivo 2 (stderr).

Quando seu terminal é iniciado, ele cria um pseudo-tty e inicia um shell com entradas/saídas atribuídas aos descritores de arquivo 0, 1 e 2. Então, se o seu programa não usar esta convenção, você terá que redirecionar adequadamente as entradas e /ou saídas.

informação relacionada