De acordo com esta resposta , stdin
, stdout
, e stderr
estão todos inicialmente conectados ao mesmo lugar (o mesmo que /dev/tty
), e a convenção de ler stdin
e escrever para stdout
e stderr
é apenas isso: uma convenção.
Nesse caso, por que ter fluxos stdin
e separados stdout
, em vez de combiná-los em um único?
Ter um fluxo de entrada separado de um fluxo de saída torna mais fácil para um programa escrever sua saída ao mesmo tempo em que está lendo sua entrada.
Torna mais fácil permitir que um programa escreva sua saída em outro lugar do que de onde veio sua entrada, usando redirecionamentos ou pipes.
Além disso, além de ser apenas uma convenção , os três fluxos de E/S padrão também são padrão . Veja, por exemplo , a seção sobre fluxos de E/S padrão na parte Interfaces do sistema do padrão POSIX.
A justificativa para essa seção diz:
Um ponteiro FILE como stdin, stdout e stderr só pode conter um descritor de arquivo subjacente. Assim, se você tiver uma configuração de pipeline como:
Então stdin, stdout e stderr do grep têm diferentes fileno()s porque existem dois pipe()s conectados. Assim, deve haver arquivos diferentes também.