STDIN(3)

NOME
stdin, stdout, stderr - fluxos padrão de E/S

SINÓPSE
#include <stdio.h> extern FILE *stdin; extern FILE *stdout; extern FILE *stderr;

DESCRIÇÃO
Sob condições normais, todo programa Unix tem três fluxos abertos para si quando inicia, um para entrada, um para saída e um para impressão de diagnósticos ou mensagens de erro. Eles estão tipicamente anexados ao terminal do usuário (veja tty(4) ), mas podem, porém, referir-se a arquivos ou outros dispositivos, dependendo do que o processo-pai escolheu. (Veja também a seção ``Redireção'' em sh(1) .)

O fluxo de entrada é mencionado como ``entrada padrão''; o fluxo de saída é mencionado como ``saída padrão''; e o fluxo de erro é mencionado como ``erro padrão''. Estes termos são abreviados para formar os símbolos usados para encaminhar para estes arquivos, isto é, stdin, stdout, e stderr.

Cada um destes símbolos é uma macro stdio(3) do tipo ponteiro para FILE, e pode ser usado com funções como fprintf(3) ou fread(3.)

Uma vez que FILEs são um invólucro de buffer em descritores de arquivos Unix, os mesmos arquivos base podem também ser acessados usando a interface de arquivo de baixo nível do Unix, isto é, funções como read(2) e lseek(2). Os descritores de arquivo inteiros associados com os fluxos stdin, stdout, e stderr são 0, 1, e 2, respectivamente. Os símbolos de preprocessador STDIN_FILENO, STDOUT_FILENO, e STDERR_FILENO são definidos com esses valores em <unistd.h>.

Note que o uso misto de FILEs e descritores de baixo nível de arquivo podem produzir resultados inesperados e deve geralmente ser evitado. (Para vocês, masoquistas: POSIX.1, seção 8.2.3, descreve em detalhes como esta interação supostamente deve funcionar.) Uma regra geral é que os descritores de arquivo são manipulados no kernel, enquanto stdio é apenas uma biblioteca. Isso quer dizer, por exemplo, que após um exec, o processo-filho herda todos os descritores de arquivo abertos, mas todos os fluxos antigos se tornaram inacessíveis.

Uma vez que os símbolos stdin, stdout, e stderr são especificados para serem macros, apontar para eles não é portável. Os fluxos padrão podem ser apontados para diferentes arquivos com a ajuda da função de biblioteca freopen(3), especialmente criada para tornar possível a redireção de stdin, stdout, e stderr. Os fluxos padrão são fechados por uma chamada a exit(3) e pelo término normal de um programa. sh(1), csh(1), open(2), fopen(3), stdio(3.)

CONSIDERAÇÕES
O fluxo stderr não fica armazenado na mémoria temporária (buffer). O fluxo stdout fica em buffer de linha quando aponta para um terminal. Linhas parciais não aparecem até que fflush(3) ou exit(3) for chamada, ou uma newline é impressa. Isso pode produzir resultados inesperados, especialmente com saída de depuração. O modo de armazenamento temporário dos fluxos padrão (ou qualquer outro fluxo) pode ser modificado usando-se a chamada setbuf(3) ou setvbuf(3). Note que em caso de stdin estar associada com um terminal, pode haver também armazenamento temporário de entrada no controlador do terminal, totalmente sem relação com o armazenamento temporário de stdio. (Aliás, normalmente, a entrada do terminal é armazenada temporariamente no kernel.). Essa manipulação de entrada pelo núcleo (kernel) pode ser modificada usando-se chamadas como tcsetattr(3); veja também stty(1), e termios(3).

DE ACORDO COM
As macros stdin, stdout, e stderr estão de acordo com a ansiC, e este padrão também estipula que estes três fluxos serão abertos no início do programa.

TRADUZIDO POR LDP-BR EM 11/06/2001.

  Tradução:
Valter Ferraz Sanches <vfs@ezlinux.cjb.net>

  Revisão.:
André Luiz Fassone <lonely_wolf@ig.com.br>