Canais padrão
Na ciência da computação, os canais padrão (ou fluxos padrão ), em todos os sistemas operacionais modernos , representam os dispositivos lógicos de entrada e saída que conectam um programa ao ambiente operacional no qual ele é executado (normalmente um terminal de texto ) e que são automaticamente conectados quando é iniciado .
Esses canais predefinidos estão disponíveis em sistemas operacionais Unix e semelhantes a Unix , ambientes de execução de linguagem C e C ++ e seus derivados.
Os três canais de entrada / saída padrão são chamados de entrada padrão , saída padrão e erro padrão (às vezes abreviado para stdin , stdout e stderr respectivamente ).
História
Na maioria dos sistemas operacionais pré-Unix, os programas tinham que criar explicitamente links para dados de entrada e saída. Para muitos desses sistemas, isso pode representar um verdadeiro desafio de habilidade de programação , devido à complexidade dos detalhes técnicos necessários para obter, por exemplo, a configuração do ambiente de execução, ou para acessar uma tabela de arquivos local, ou para determinar o conjunto de dados sobre os quais operar e gerenciar separadamente caixas específicas para cartões e fitas perfuradas, fitas magnéticas, discos, impressoras e terminais interativos.
O Unix foi a fonte de inovações radicais, incluindo a abstração de dispositivos de entrada / saída: isso liberou os programas da carga de saber ou gerenciar o tipo de dispositivos com os quais estavam se comunicando. Os sistemas operacionais predecessores exigiam que o programador executasse operações de leitura e gravação em blocos de dados, geralmente com dados e semânticas de controle periférico que não eram ortogonais. O Unix eliminou essa complexidade introduzindo o conceito de fluxo de dados , ou seja, sequências ordenadas de bytes que podem ser lidos até o esgotamento. Um programa também tinha a capacidade de gravar quantidades arbitrárias de dados, sem precisar declarar com antecedência o tamanho total e como agrupá-los.
Outra inovação do Unix foi a de disponibilizar automaticamente canais de entrada e saída predefinidos: no caso típico de um programa que adquire dados de entrada e os processa para então produzir os resultados de saída, o programa (e o programador) não precisa fazer nada para preparar os canais de entrada e saída; os sistemas operacionais predecessores do Unix, por outro lado, geralmente exigiam a preparação de instruções - muitas vezes complexas - expressas em Job Control Language ou, em qualquer caso, carregavam o programa com uma carga equivalente.
Como o Unix fornecia os canais padrão, os ambientes de execução da linguagem C tinham que oferecer suporte para isso, com o resultado que hoje a maioria deles (e descendentes da linguagem C) fornece funcionalidade equivalente independente do sistema operacional.
Descrição
Entrada padrão (stdin)
A entrada padrão é um canal a partir do qual um fluxo de dados (geralmente textuais) chega a um programa. O programa os transfere executando operações de leitura . Nem todos os programas precisam de dados de entrada: por exemplo, os comandos ls ou dir (que mostram o conteúdo dos diretórios ) fazem seu trabalho sem a necessidade de ler os dados de entrada.
O fluxo de entrada, exceto em casos de redirecionamento , vem do terminal (por exemplo, pelo usuário via teclado ) a partir do qual o programa foi iniciado.
O descritor de arquivo associado à entrada padrão é aquele com índice 0 ; a variável de linguagem C correspondente, definida em <stdio.h> , é FILE * stdin ; da mesma forma, a variável de linguagem C ++ definida em <iostream> é std :: cin .
Saída padrão (stdout)
A saída padrão é o canal no qual um programa grava seus dados de saída. O programa transfere dados executando operações de gravação . Nem todos os programas produzem saída: por exemplo, o comando mv (que altera o nome de um arquivo ou diretório) normalmente não produz dados de saída.
O fluxo de saída, exceto em casos de redirecionamento , é direcionado ao terminal a partir do qual o programa foi iniciado (por exemplo, para monitorar ou console em favor do usuário).
O descritor de arquivo associado à saída padrão é aquele com índice 1 ; a variável de linguagem C correspondente, definida em <stdio.h> , é FILE * stdout ; da mesma forma, a variável de linguagem C ++, definida em <iostream> , é std :: cout .
Erro padrão (stderr)
O erro padrão é outro canal de saída, normalmente usado por programas para mensagens de erro ou diagnóstico. É um canal independente da saída padrão e pode ser redirecionado separadamente dos outros. Seu destino é geralmente o terminal de onde o programa foi iniciado, a fim de maximizar as chances de ser visto mesmo quando a saída padrão é direcionada para outro lugar: por exemplo, no caso de um pipeline de software , a saída de um programa que é fornecida como entrada para o próximo programa, mas suas mensagens de erro ainda são exibidas no terminal.
É aceitável e normal que a saída padrão e o erro padrão tenham o mesmo destino, como no caso do terminal de texto: as mensagens aparecem na mesma ordem em que o programa as escreve, exceto quando buffers estão em uso (por exemplo, quando o o erro padrão não tem buffer e a saída padrão tem um buffer de linha: neste caso, os dados gravados no erro padrão posteriormente podem aparecer antes dos dados gravados na saída padrão a princípio, pois o buffer de saída padrão pode ainda não ter preenchido).
O descritor de arquivo associado ao erro padrão é aquele com índice 2 ; a variável de linguagem C correspondente, definida em <stdio.h> , é FILE * stderr ; na linguagem C ++ <iostream> define duas variáveis associadas a este canal: std :: cerr e std :: clog , das quais a primeira não tem buffer enquanto a segunda usa buffers semelhantes aos outros canais C ++.
A maioria dos shells de texto permitem que você redirecione a saída padrão e o erro padrão para o mesmo arquivo com a sintaxe
> & nome do arquivo
Equivalente a:
&> nome do arquivo
O shell Bourne e seus derivados permitem que você direcione o erro padrão para o mesmo destino que a saída padrão com a sintaxe
2> e 1
Cronologia
1950 : Fortran
Fortran forneceu o equivalente aos descritores de arquivo Unix , UNIT=5
para entrada padrão e UNIT=6
para saída padrão .
! Exemplo de FORTRAN 77
PROGRAMA PRINCIPAL
LEIA ( UNIDADE = 5 , * ) NÚMERO
ESCREVER ( UNIDADE = 6 , '(F5.3)' ) 'NÚMERO É:' , NÚMERO
FIM
1960 : ALGOL 60
ALGOL 60 foi criticado por não fornecer um mecanismo padrão de acesso a arquivos .
1968 : ALGOL 68
O termo transput geralmente se refere às funções de entrada e saída do ALGOL 68 . Koster coordenou a definição do padrão de transput . Este padrão incluía: stand in
- stand in
, stand out
, stand back
e stand error
.
Exemplo:
# ALGOL 68 exemplo # a Principal :( Número real; getf (substitua, ($ g $, número)); printf (($ "Número é:" g (6,4) "OU" $, número)); # OU # putf (destaque, ($ "Número é:" g (6,4) "!" $, número)); newline (destaque) )
Entrada: | Saída: |
---|---|
3,14159 | O número é: +3,142 OU o número é: +3,142! |
1970 : C e Unix
Na linguagem C, os stderr
stdin
, stdout
e stderr
foram associados aos descritores de arquivo Unix 0, 1 e 2, respectivamente.
1980 : C ++
Em C ++, os canais padrão eram associados aos objetos cin
, cout
e cerr
.
1990 : Java
Em Java e nas linguagens que aderem a esta plataforma, os canais padrão referem-se a: System.in
(para stdin), System.out
(para stdout) e System.err
(para stderr). Como exemplo, você pode usar o objeto BufferedReader
classe BufferedReader
:
public static void main ( String args [] ) {
tente {
BufferedReader br =
novo BufferedReader ( novo InputStreamReader ( System . in ));
String s = br . readLine ();
número duplo = duplo . parseDouble ( s );
Sistema . fora. println ( "Número é:" + número );
} catch ( Exceção e ) {
Sistema . err . println ( "Erro:" + e . getMessage ());
}
}
Ou você pode usar a classe Scanner
, pertencente ao pacote java.util
public static void main ( String [] args ) {
Scanner sc = novo Scanner ( Sistema . In );
while ( sc . hasNextLine ()) {
String line = sc . nextLine ();
número duplo = duplo . parseDouble ( linha );
Sistema . fora. println ( "Número é:" + número );
}
}
Década de 2000 : .NET
Em C sharp e outras linguagens .NET Framework , os canais padrão tornaram-se acessíveis via System.Console
(para entrada e saída padrão ) e System.Console.Error
(para erro padrão )
// exemplo C #
public static int Main ()
{
número duplo ;
string s ;
Experimente
{
s = sistema . Console . ReadLine ();
número = duplo . Analisar ( s );
Sistema . Console . WriteLine ( "Número é: {0: F3}" , número );
return 0 ;
}
catch ( System . FormatException e )
{
// se Parse () lançou uma exceção
Sistema . Console . Erro . WriteLine ( "Nenhum número foi inserido!" );
return 1 ;
}
}
'Exemplo de Visual Basic .NET
Função pública Main () como inteiro
Dim number As Double
Dim s As String
Experimente
s = sistema . Console . ReadLine ()
número = CDbl ( s )
Sistema . Console . WriteLine ( "Número é: {0: F3}" , número )
Retorno 0
Catch and As System . InvalidCastException
'se Parse () lançou uma exceção
Sistema . Console . Erro . WriteLine ( "Nenhum número foi inserido!" )
Retorno 1
Fim da tentativa
Função Final
GUI
As interfaces gráficas raramente fazem uso de canais padrão e, conseqüentemente, com eles, o redirecionamento e os pipelines de software não são práticos nem úteis. As ações de recortar , copiar e colar entre diferentes aplicativos são provavelmente o que melhor se aproxima do conceito de canais padrão, mas como devem ser feitas manualmente, ter que executar um grande número deles não é particularmente eficiente. Uma exceção ao acima pode ser o gerenciador de janelas dinâmico , que lê as mensagens de status a serem exibidas a partir da entrada padrão .
Alguns programas GUI, principalmente em sistemas Unix e semelhantes ao Unix , ainda usam o erro padrão para escrever suas mensagens de diagnóstico.
Bibliografia
- Manual de referência KRONOS 2.1 , Control Data Corporation, número de peça 60407000, 1974
- NOS Versão 1 Applications Programmer's Instant , Control Data Corporation, Part Number 60436000, 1978
- Nível 68 de introdução à programação em MULTICS , Honeywell Corporation, 1981
- Evolução do Sistema Operacional MVS , IBM Corporation, 1981
- Comentário do Lions sobre a sexta edição do UNIX , John Lions, ISBN 1-57398-013-7 , 1977
- Classe de console, biblioteca de classes .NET Framework , Microsoft Corporation, 2008
Itens relacionados
links externos
- ( EN ) Definição de Saída Padrão - por The Linux Information Project (LINFO)