# Fluxos padrão

Os fluxos padrão são canais de entrada/saída entre um programa de computador e o seu ambiente (tipicamente um terminal de texto) que são pré-conectados no início da execução. Estas conexões padrão são disponibilizadas nos sistemas operacionais do tipo Unix, ambientes de execução das linguagens C e C++ e seus sucessores. As três conexões de I/O são chamadas de entrada padrão (do inglês standard input), saída padrão (do inglês standard output) e erro padrão (do inglês stardard error).

## Histórico

Na maioria dos sistemas operacionais que precederam o Unix, os programas tinham que conectar explicitamente com a saída e entrada de dados apropriada. Em muitos destes sistemas isto podia ser um grande desafio de programação devido às diferentes características de cada sistema operacional na implementação de algumas operações, como a obtenção das configurações de ambiente, acesso à tabela local de arquivos, determinação do significado dos dados, e a manipulação correta de dispositivos periféricos, como um leitor de cartão, fita magnética, disco rígido ou terminal interativo.
O Unix trouxe uma série de inovações, como o advento dos dispositivos abstratos. Não era mais necessário ao programa conhecer ou se preocupar com o tipo de dispositivo que faria conexão. Os sistemas operacionais mais antigos deixavam com o programador a responsabilidade de manipular estruturas de registros, semântica de dados (normalmente não ortogonais) e controle de dispositivos. O Unix eliminou a complexidade com o conceito de fluxo de dados: uma sequência ordenada de bytes que podem ser lidos até o final do arquivo. Um programa também pode escrever os bytes que precisa sem declarar quantos serão, ou como eles serão agrupados.
Outra inovação do Unix foi associar automaticamente a entrada/saída a um programa, por padrão. O programa (e o programador) nada fazem para estabelecer a entrada/saída para um programa típico (a não ser que o programa escolha algum outro paradigma). Em contraste, nos sistemas operacionais anteriores, quando se desejava estabelecer conexões era necessário lidar com a complexidade das linguagens de controle de job, ou o programa criava estas conexões diretamente no seu código.
Desde que o Unix disponibilizou os fluxos padrão, o ambiente da linguagem C no Unix foi obrigado a suportá-los também. Como resultado, a maioria dos ambientes C (e seus descendentes), independentemente do sistema operacional, disponibilizam uma funcionalidade equivalente.
Em C toda entrada e saída é feita com streams (fluxos) de caracteres organizadas em linhas. Cada linha consiste de zero ou mais caracteres e termina com o caractere de final de linha. Pode haver até 254 caracteres em uma linha (incluindo o caracter de final de linha). Quando um programa inicia, o sistema operacional automaticamente define quem é a entrada padrão (geralmente o teclado) e quem é a saída padrão (geralmente a tela).

## Conexões
### Entrada padrão (stdin)

A entrada padrão indica que o dado (frequentemente texto) está indo para um programa. O programa requisita a transferência de dados através de uma operação de "leitura". Nem todos programas precisam de entrada. Por exemplo, o programa ls (equivalente no Unix ao dir do MS-DOS) realiza a sua operação sem nenhum fluxo de entrada de dados.
Se a entrada não for "redirecionada", a origem da entrada de um programa é o terminal de texto de onde o programa foi executado.
O descritor de arquivo para a entrada padrão é 0 (zero); a variável correspondente na biblioteca stdio.h é FILE *stdin.

### Saída padrão (stdout)

A saída padrão é um fluxo onde o programa escreve dados de saída. O programa requisita a transferência de dados através de uma operação de "escrita". Nem todos os programas precisam de saída. Por exemplo, o comando mv (equivalente no Unix do move do MS-DOS) não produz qualquer saída após a sua execução.
Se a saída não for "redirecionada", o destino da saída padrão é o terminal de texto de onde o programa foi executado.
O descritor de arquivo para a saída padrão é 1 (um); a variável correspondente na biblioteca stdio.h é FILE *stdout.

### Erro padrão (stderr)

O erro padrão é um outro tipo de saída padrão, é utilizada pelos programas para envio de mensagens de erro ou de diagnóstico. Este fluxo é independente da saída padrão e pode ser redirecionado separadamente. O destino usual é o terminal de texto onde o programa foi executado, para que haja uma grande chance da saída ser observada mesmo que a "saída padrão" tenha sido redirecionada (e portanto não observável prontamente). Por exemplo, a saída de um programa em uma canalização Unix é redirecionada para a entrada do próximo programa, mas os erros de cada um deles continuam sendo direcionados ao terminal de texto.
É aceitável, e até normal, que a "saída padrão" e o "erro padrão" sejam direcionados para o mesmo destino, como um terminal de texto. As mensagens aparecem na mesma ordem em que o programa as escreve.
O descritor de arquivo para o erro padrão é 2; a variável correspondente na biblioteca stdio.h é FILE *stderr.