close

Standaard kanalen

Spring naar navigatie Spring naar zoeken

In de informatica vertegenwoordigen de standaardkanalen (of standaardstromen ), in alle moderne besturingssystemen , de logische invoer- en uitvoerapparaten die een programma verbinden met de besturingsomgeving waarin het wordt uitgevoerd (meestal een tekstterminal ) en die automatisch worden verbonden wanneer het wordt gestart .

Deze vooraf gedefinieerde kanalen zijn beschikbaar in Unix- en Unix-achtige besturingssystemen , C- en C++- taaluitvoeringsomgevingen en hun afgeleiden.

De drie standaard input/output kanalen worden standaard input , standaard output en standaard error genoemd (soms afgekort tot respectievelijk stdin , stdout en stderr ).

Geschiedenis

In de meeste pre-Unix-besturingssystemen moesten programma's expliciet koppelingen maken naar invoer- en uitvoergegevens. Voor veel van deze systemen kan dit een echte uitdaging voor programmeervaardigheden zijn , vanwege de complexiteit van de technische details die nodig zijn om bijvoorbeeld de configuratie van de uitvoeringsomgeving te verkrijgen, of om toegang te krijgen tot een tabel met lokale bestanden , of om de set te bepalen van gegevens voor het bedienen en afzonderlijk beheren van specifieke koffers voor kaarten en ponsbanden, magneetbanden, schijven, printers en interactieve terminals.

Unix was de bron van radicale innovaties, waaronder de abstractie van input/output-randapparatuur: dit bevrijdde programma's van de last om het type randapparatuur waarmee ze communiceerden te moeten kennen of beheren. Bij eerdere besturingssystemen moest de programmeur lees- en schrijfbewerkingen uitvoeren in gegevensblokken, vaak met semantiek voor gegevens en randapparatuur die niet orthogonaal waren. Unix elimineerde deze complexiteit door het concept van gegevensstroom te introduceren , dat wil zeggen geordende reeksen bytes die konden worden gelezen totdat ze waren uitgeput. Een programma had ook de mogelijkheid om willekeurige hoeveelheden data te schrijven, zonder vooraf de totale grootte en hoe ze te groeperen hoefden te vermelden.

Een andere Unix-innovatie was die van het automatisch beschikbaar stellen van vooraf gedefinieerde invoer- en uitvoerkanalen: in het typische geval van een programma dat invoergegevens verwerft en verwerkt om vervolgens de uitvoerresultaten te produceren, hoeft het programma (en de programmeur) niets te doen om bereid de invoer- en uitvoerkanalen voor; de voorlopers van de besturingssystemen van Unix daarentegen vereisten meestal de voorbereiding van instructies - vaak complexe - uitgedrukt in Job Control Language , of belastten het programma in ieder geval met een gelijkwaardige last.

Aangezien Unix de standaardkanalen leverde, moesten de C- taaluitvoeringsomgevingen hiervoor ondersteuning bieden, met als resultaat dat de meeste van hen (en afstammelingen van de C-taal) tegenwoordig gelijkwaardige functionaliteit bieden, ongeacht het besturingssysteem.

Beschrijving

Standaard invoer (stdin)

De standaardinvoer is een kanaal van waaruit een stroom gegevens (vaak tekstueel) een programma binnenkomt. Het programma draagt ​​ze over door leesbewerkingen uit te voeren . Niet alle programma's hebben invoergegevens nodig: de ls o -opdrachten dir(die de inhoud van mappen tonen ) voeren bijvoorbeeld hun taak uit zonder dat invoergegevens hoeven te worden gelezen.

De invoerstroom, behalve in gevallen van omleiding , komt van de terminal (bijv. door de gebruiker via toetsenbord ) van waaruit het programma is gestart.

De bestandsdescriptor die bij standaardinvoer hoort, is die met index 0; de corresponderende C-taalvariabele, gedefinieerd in <stdio.h> , is FILE* stdin; op dezelfde manier is de C ++ -taalvariabele gedefinieerd in <iostream>std::cin .

Standaard output (stdout)

Standaarduitvoer is het kanaal waarop een programma zijn uitvoergegevens schrijft . Het programma draagt ​​gegevens over door schrijfbewerkingen uit te voeren . Niet alle programma's produceren uitvoer: bijvoorbeeld het mv -commando (dat de naam van een bestand of map wijzigt) produceert normaal gesproken geen uitvoergegevens.

De uitvoerstroom, behalve in gevallen van omleiding , wordt naar de terminal geleid van waaruit het programma is gestart (bijvoorbeeld om te monitoren of te consolen in het voordeel van de gebruiker).

De bestandsdescriptor die is gekoppeld aan standaarduitvoer is die met index 1; de corresponderende C-taalvariabele, gedefinieerd in <stdio.h> , is FILE* stdout; op dezelfde manier is de C ++ -taalvariabele, gedefinieerd in <iostream> , std::cout.

Standaardfout (stderr)

Standaardfout is een ander uitgangskanaal dat doorgaans door programma's wordt gebruikt voor fout- of diagnostische berichten . Het is een onafhankelijk kanaal van de standaarduitvoer en kan afzonderlijk van de andere worden omgeleid . De bestemming is meestal de terminal van waaruit het programma is gestart, om de kans om gezien te worden zo groot mogelijk te maken, zelfs wanneer de standaarduitvoer ergens anders is gericht: bijvoorbeeld in het geval van een softwarepijplijn , de uitvoer van een programma dat het wordt geleverd als invoer voor het volgende programma, maar de foutmeldingen worden nog steeds weergegeven op de terminal.

Het is acceptabel en normaal dat standaarduitvoer en standaardfout dezelfde bestemming hebben, zoals in het geval van de tekstterminal: berichten verschijnen in dezelfde volgorde waarin het programma ze schrijft, behalve wanneer buffers in gebruik zijn (bijvoorbeeld wanneer de standaardfout heeft geen buffer en de standaarduitvoer heeft een lijnbuffer : in dit geval kunnen de gegevens die op een later tijdstip naar de standaardfout zijn geschreven , verschijnen voordat de gegevens die eerst naar de standaarduitvoer zijn geschreven , omdat de standaarduitvoerbuffer dat misschien nog niet heeft gevuld).

De bestandsdescriptor die bij de standaardfout hoort, is die met index 2; de corresponderende C-taalvariabele, gedefinieerd in <stdio.h> , is FILE* stderr; in C++-taal definieert <iostream> twee variabelen die bij dit kanaal horen: std::cerren std::clog, waarvan de eerste geen buffer heeft terwijl de tweede buffers gebruikt die vergelijkbaar zijn met de andere C++-kanalen.

Met de meeste tekstshells kun je standaarduitvoer en standaardfout omleiden naar hetzelfde bestand met de syntaxis

> & bestandsnaam

equivalent van:

&> bestandsnaam

Met de Bourne-shell en zijn afgeleiden kunt u de standaardfout naar dezelfde bestemming sturen als de standaarduitvoer met de syntaxis

2> & 1

Geschiedenis

1950s : Fortran

Fortran leverde het equivalent van Unix -bestandsdescriptors , voor standaardinvoer en voor standaarduitvoer . UNIT=5UNIT=6

! FORTRAN 77 voorbeeld 
      PROGRAMMA HOOFDLEES 
      ( EENHEID = 5 , * ) NUMMER SCHRIJVEN ( EENHEID = 6 , '(F5.3)' ) ' NUMMER IS:' , NUMMER EINDE
      
      

1960 : ALGOL 60

ALGOL 60 werd bekritiseerd omdat het geen standaard mechanisme voor bestandstoegang bood .

1968 : ALGOL 68

De term transput verwijst in het algemeen naar de input- en outputfuncties van de ALGOL 68 . Koster coördineerde de definitie van de transputstandaard . Deze standaard omvatte : stand in,, stand outen stand error.stand back

Voorbeeld:

# ALGOL 68 voorbeeld #
hoofd :(
  Echt nummer;
  getf (binnenkomen, ($ g $, aantal));
  printf (($ "Nummer is:" g (6,4) "OF" $, nummer)); # OF #
  putf (opvallen, ($ "Nummer is:" g (6,4) "!" $, aantal));
  nieuwe regel (opvallen)
)
Invoer: Uitgang:
3.14159
Nummer is: +3.142 OF Nummer is: +3.142!

Jaren 70 : C en Unix

In de C-taal werden kanalen stdinen stdoutrespectievelijk stderrgeassocieerd met Unix -bestandsdescriptors 0, 1 en 2.

1980s : C ++

In C++ werden standaardkanalen geassocieerd met respectievelijk objecten cinen . coutcerr

1990s : Java

In Java en in de talen die bij dit platform horen, verwijzen de standaardkanalen naar: System.in(voor stdin), System.out(voor stdout) en System.err(voor stderr). Als voorbeeld kunt u het BufferedReader-object van de klasse gebruiken BufferedReader :

public  static  void  main ( Stream  args [] )  { 
    probeer  { 
        BufferedReader  br  =  
          nieuwe  BufferedReader ( nieuwe  InputStreamReader ( System . in )); 
        Tekenreeks  s  =  br . leesregel (); 
        dubbel  nummer  =  dubbel . ontledenDouble ( s ); 
        Systeem . uit . println ( "Nummer is:"  +  nummer ); 
    }  catch  ( Uitzondering  e )  { 
        Systeem . fout . println ( "Fout:"  +  bijv . getMessage ()); 
    } 
}

Of u kunt de class gebruiken Scannerdie bij het pakket java.util hoort

    public  static  void  main ( String []  args )  { 
        Scanner  sc  =  nieuwe  scanner ( Systeem . in ); 
        while ( sc . hasNextLine ())  { 
            String  line  =  sc . volgende regel (); 
            dubbel  nummer  =  dubbel . parseDouble ( regel ); 
            Systeem . uit . println ( "Nummer is:"  +  nummer ); 
        } 
    }

2000s : .NET

In C sharp en andere talen van het .NET Framework werden standaardkanalen toegankelijk via System.Console(voor standaardinvoer en standaarduitvoer ) en System.Console.Error(voor standaardfout )

// C # voorbeeld 
public  static  int  Main () 
{ 
    double  number ; 
    tekenreeks  s ;

    probeer 
    { 
        s  =  Systeem . console . Leesregel (); 
        getal  =  dubbel . Ontleden ( s ); 
        Systeem . console . WriteLine ( "Nummer is: {0: F3}" ,  getal ); 
        retourneer  0 ; 
    } 
    catch  ( Systeem . FormatException  e ) 
    { 
        // if Parse() gooide een uitzondering 
        System . console . Fout . WriteLine ( "Er is geen nummer ingevoerd!" ); 
        retour  1 ; 
    } 
}
'Visual Basic .NET voorbeeld'

Publieke  functie  Main ()  As  Integer 
    Dim -  nummer  As  Double 
    Dim  s  As  String

    Probeer 
        s  =  Systeem . console . ReadLine () 
        nummer  =  CDbl ( ' s ) 
        Systeem . console . WriteLine ( "Nummer is: {0: F3}" ,  getal ) 
        Return  0 
    Catch  en  As  System . InvalidCastException 
        'if Parse () gooide een uitzondering 
        System . console . Fout . WriteLine ( "Er is geen nummer ingevoerd!" ) 
        Return  1 
    End  Try 
End  Functie

GUI

Grafische interfaces maken zelden gebruik van standaardkanalen, en bijgevolg zijn omleiding en softwarepijplijnen noch praktisch noch nuttig. De acties van knippen , kopiëren en plakken tussen verschillende toepassingen zijn waarschijnlijk wat het concept van standaardkanalen het beste benadert, maar aangezien ze handmatig moeten worden gedaan, is het niet bijzonder efficiënt om een ​​groot aantal ervan uit te voeren. Een uitzondering op het bovenstaande kan de Dynamic window manager zijn, die statusberichten leest die moeten worden weergegeven vanuit de standaard invoer .

Sommige GUI-programma's, meestal op Unix- en Unix-achtige systemen , gebruiken nog steeds de standaardfout om hun diagnostische berichten te schrijven.

Bibliografie

Gerelateerde items

Externe links

  • ( EN ) Standaard uitvoerdefinitie - door The Linux Information Project (LINFO)