Receio que sua compreensão seja completamente invertida. :)
Pense em "entrada padrão", "saída padrão" e "erro padrão" da perspectiva do programa , não da perspectiva do kernel.
Quando um programa precisa imprimir a saída, normalmente imprime na "saída padrão". Normalmente, um programa imprime a saída na saída padrão printf
, que imprime SOMENTE na saída padrão.
Quando um programa precisa imprimir informações de erro (não necessariamente exceções, essas são uma construção da linguagem de programação, imposta em um nível muito mais alto), normalmente é impresso como "erro padrão". Normalmente, faz isso com fprintf
, que aceita um fluxo de arquivos para usar na impressão. O fluxo de arquivos pode ser qualquer arquivo aberto para gravação: saída padrão, erro padrão ou qualquer outro arquivo que tenha sido aberto com fopen
ou fdopen
.
"entrada padrão" é usado quando o arquivo precisa ler a entrada, usando fread
ou fgets
, ou getchar
.
Qualquer um desses arquivos pode ser facilmente redirecionado do shell, assim:
cat /etc/passwd > /tmp/out # redirect cat's standard out to /tmp/foo
cat /nonexistant 2> /tmp/err # redirect cat's standard error to /tmp/error
cat < /etc/passwd # redirect cat's standard input to /etc/passwd
Ou toda a enchilada:
cat < /etc/passwd > /tmp/out 2> /tmp/err
Há duas advertências importantes: primeiro, "entrada padrão", "saída padrão" e "erro padrão" são apenas uma convenção. Eles são uma convenção muito forte , mas é apenas um acordo que é muito bom poder executar programas como este: grep echo /etc/services | awk '{print $2;}' | sort
e ter as saídas padrão de cada programa conectadas à entrada padrão do próximo programa no pipeline.
Segundo, forneci as funções ISO C padrão para trabalhar com fluxos de arquivos ( FILE *
objetos) - no nível do kernel, são todos os descritores de arquivos ( int
referências à tabela de arquivos) e operações de nível muito inferior, como read
e write
, que não são faça o buffer feliz das funções ISO C. Eu pensei em simplificar e usar as funções mais fáceis, mas pensei que você deveria conhecer as alternativas. :)