Canalele standard

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

În informatică , canalele standard (sau fluxurile standard ), în toate sistemele de operare moderne, reprezintă dispozitivele logice de intrare și ieșire care conectează un program la mediul de operare în care este executat (de obicei un terminal text ) și care sunt conectate automat atunci când este început .

Aceste canale predefinite sunt disponibile în Unix si Unix- ului de operare sisteme , C si C ++ limbaj medii de execuție și derivații lor.

Cele trei canale de intrare / ieșire implicite se numesc intrare standard , ieșire standard și eroare standard (uneori prescurtate în stdin , stdout și respectiv stderr ).

Istorie

În majoritatea sistemelor de operare pre-Unix, programele trebuiau să creeze în mod explicit legături către datele de intrare și ieșire. Pentru multe dintre aceste sisteme, aceasta ar putea reprezenta o adevărată provocare a abilităților de programare , datorită complexității detaliilor tehnice necesare pentru a obține, de exemplu, configurația mediului de execuție sau pentru a accesa un tabel de fișiere locale sau pentru a determina setul de date pe care să operați și să gestionați separat carcase specifice pentru carduri și benzi perforate, benzi magnetice, discuri, imprimante și terminale interactive.

Unix a fost sursa inovațiilor radicale, inclusiv abstractizarea dispozitivelor de intrare / ieșire: acest lucru a eliberat programele de sarcina de a cunoaște sau de a gestiona tipul de dispozitive cu care comunicau. Sistemele de operare precedente au cerut programatorului să efectueze operații de citire și scriere în blocuri de date, adesea cu date și semantică de control periferic care nu erau ortogonale. Unix a eliminat această complexitate prin introducerea conceptului de flux de date , adică secvențe ordonate de octeți care puteau fi citite până la epuizare. Un program avea, de asemenea, capacitatea de a scrie cantități arbitrare de date, fără a fi nevoie să precizeze în prealabil dimensiunea totală și cum să le grupezi.

O altă inovație Unix a fost aceea de a pune automat la dispoziție canale de intrare și ieșire predefinite: în cazul tipic al unui program care obține date de intrare și le procesează pentru a produce apoi rezultatele de ieșire, programul (și programatorul) nu trebuie să facă nimic pentru pregătește canalele de intrare și ieșire; predecesorii sistemelor de operare Unix, pe de altă parte, au necesitat de obicei pregătirea instrucțiunilor - adesea complexe - exprimate în Job Control Language sau, în orice caz, au încărcat programul cu o sarcină echivalentă.

Deoarece Unix a furnizat canalele standard, mediile de execuție a limbajului C au trebuit să ofere suport pentru acest lucru, cu rezultatul că astăzi majoritatea acestora (și descendenții limbajului C) oferă funcționalități echivalente indiferent de sistemul de operare.

Descriere

Intrare standard (stdin)

Intrarea standard este un canal de la care un flux de date (adesea textual) intră într-un program. Programul le transferă efectuând operații de citire . Nu toate programele au nevoie de date de intrare: de exemplu, comenzile ls sau dir (care arată conținutul directoarelor ) își fac treaba fără a fi nevoie să citească datele de intrare.

Fluxul de intrare, cu excepția cazurilor de redirecționare , provine de la terminal (de exemplu, de către utilizator prin tastatură ) de la care a fost pornit programul.

Descriptorul de fișiere asociat cu intrarea standard este cel cu index 0 ; variabila de limbaj C corespunzătoare, definită în <stdio.h> , este FILE * stdin ; în mod similar, variabila de limbaj C ++ definită în <iostream> este std :: cin .

Ieșire standard (stdout)

Ieșirea standard este canalul pe care un program își scrie datele de ieșire. Programul transferă date efectuând operații de scriere . Nu toate programele produc ieșire: de exemplu, comanda mv (care schimbă numele unui fișier sau director) nu produce în mod normal date de ieșire.

Fluxul de ieșire, cu excepția cazurilor de redirecționare , este direcționat către terminalul de la care a fost pornit programul (de exemplu, pentru a monitoriza sau consola în favoarea utilizatorului).

Descriptorul de fișiere asociat cu ieșirea standard este cel cu indexul 1 ; variabila de limbaj C corespunzătoare, definită în <stdio.h> , este FILE * stdout ; în mod similar, variabila de limbaj C ++, definită în <iostream> , este std :: cout .

Eroare standard (stderr)

Eroarea standard este un alt canal de ieșire, utilizat de obicei de programe pentru mesaje de eroare sau de diagnosticare. Este un canal independent de ieșirea standard și poate fi redirecționat separat de celelalte. Destinația sa este de obicei terminalul de la care a fost pornit programul, pentru a maximiza șansele de a fi văzut chiar și atunci când ieșirea standard este direcționată în altă parte: de exemplu, în cazul unei conducte software , ieșirea unui program este furnizată ca intrare la următorul program, dar mesajele sale de eroare sunt încă afișate pe terminal.

Este acceptabil și normal ca ieșirea standard și eroarea standard să aibă aceeași destinație, ca în cazul terminalului text: mesajele apar în aceeași ordine în care le scrie programul, cu excepția cazului în care sunt utilizate buffere (de exemplu, atunci când eroarea standard nu are tampon și ieșirea standard are un buffer de linie: în acest caz, datele scrise la eroarea standard mai târziu pot apărea înainte de datele scrise la ieșirea standard la început, deoarece bufferul de ieșire standard poate să nu aibă încă a fost umplut).

Descriptorul de fișiere asociat erorii standard este cel cu indexul 2 ; variabila de limbaj C corespunzătoare, definită în <stdio.h> , este FILE * stderr ; în limbajul C ++ <iostream> definește două variabile asociate acestui canal: std :: cerr și std :: clog , dintre care prima nu are tampon în timp ce a doua folosește buffere similare celorlalte canale C ++.

Majoritatea shell-urilor de text vă permit să redirecționați ieșirea standard și eroarea standard către același fișier cu sintaxa

 > & numele fișierului

echivalentul a:

 &> numele fișierului

Shell-ul Bourne și derivatele sale vă permit să direcționați eroarea standard către aceeași destinație ca ieșirea standard cu sintaxa

 2> & 1

Cronologie

Anii 1950 : Fortran

Fortran a furnizat echivalentul descriptorilor de fișiere Unix , UNIT=5 pentru intrarea standard și UNIT=6 pentru ieșirea standard .

 ! FORTRAN 77 exemplu
      PROGRAM PRINCIPAL
      CITIȚI ( UNITATE = 5 , * ) NUMĂR
      SCRIERE ( UNITATE = 6 , '(F5.3)' ) 'NUMĂR ESTE:' , NUMĂR
      SFÂRȘIT

1960 : ALGOL 60

ALGOL 60 a fost criticat pentru că nu a furnizat un mecanism standard de acces la fișiere .

1968 : ALGOL 68

Termenul de transmisie se referea în general la funcțiile de intrare și ieșire ale ALGOL 68 . Koster a coordonat definirea standardului transput. Acest standard a inclus: stand in , stand out , stand error și stand back .

Exemplu:

 # ALGOL 68 exemplu #
principal :(
  Numar real;
  getf (stand in, ($ g $, număr));
  printf (($ "Numărul este:" g (6,4) "SAU" $, număr)); # SAU #
  putf (ieșiți în evidență, ($ "Numărul este:" g (6,4) "!" $, număr));
  newline (ieși în evidență)
)
Intrare: Ieșire:
 3.14159
 Numărul este: +3.142 SAU Numărul este: +3.142!

Anii 1970 : C și Unix

În limbajul C, stderr stdin , stdout și stderr au fost asociate cu descriptorii de fișiere Unix 0, 1 și respectiv 2.

Anii 1980 : C ++

În C ++ , canalele standard au fost asociate cu obiectele cin , cout și cerr .

Anii 1990 : Java

În Java și în limbile care aderă la această platformă, canalele standard se referă la: System.in (pentru stdin), System.out (pentru stdout) și System.err (pentru stderr). De exemplu, puteți utiliza obiectul BufferedReader clasa BufferedReader :

 public static void main (String args []) {
    incearca {
        BufferedReader br = 
          nou BufferedReader ( nou InputStreamReader ( System . in ));
        Șirul s = br . readLine ();
        număr dublu = Double . parseDouble ( s );
        Sistem . afară . println ( "Numărul este:" + număr );
    } catch ( Exception e ) {
        Sistem . greșește . println ( "Eroare:" + e . getMessage ());
    }
}

Sau puteți utiliza clasa Scanner , aparținând pachetului java.util

 public static void main ( String [] args ) {
        Scanner scan = Scanner nou ( System . In );
        while ( sc . hasNextLine ()) {
            Linia șirului = sc . nextLine ();
            număr dublu = Double . parseDouble ( line );
            Sistem . afară . println ( "Numărul este:" + număr );
        }
    }

Anii 2000 : .NET

În limbile C sharp și alte limbi .NET Framework , canalele standard au devenit accesibile prin System.Console (pentru intrare standard și ieșire standard ) și System.Console.Error (pentru eroare standard )

 // Exemplu C #
public static int Main ()
{
    număr dublu ;
    coarda s ;

    încerca
    {
        s = Sistem . Consolă . ReadLine ();
        număr = dublu . Parse ( s );
        Sistem . Consolă . WriteLine ( „Numărul este: {0: F3}” , număr );
        retur 0 ;
    }
    catch ( System . FormatException e )
    {
        // dacă Parse () a lansat o excepție
        Sistem . Consolă . Eroare . WriteLine ( „Nu a fost introdus niciun număr!” );
        retur 1 ;
    }
}
 'Exemplu Visual Basic .NET

Funcția publică principală () Ca întreg
    Reduceți numărul ca dublu
    Dim s As String

    Încerca
        s = Sistem . Consolă . ReadLine ()
        număr = CDbl ( s )
        Sistem . Consolă . WriteLine ( „Numărul este: {0: F3}” , număr )
        Returnează 0
    Catch and As System . InvalidCastException
        'dacă Parse () a făcut o excepție
        Sistem . Consolă . Eroare . WriteLine ( „Nu a fost introdus niciun număr!” )
        Întoarcere 1
    end Încercați
Funcția de sfârșit

GUI

Interfețele grafice utilizează rareori canale standard și, prin urmare, redirecționarea și conductele software nu sunt nici practice, nici utile. Acțiunile de tăiere , copiere și lipire între diferite aplicații sunt probabil cele care se apropie cel mai bine de conceptul de canale standard, dar, deoarece acestea trebuie făcute manual, trebuie să efectuați un număr mare dintre ele nu este deosebit de eficient. O excepție de la cele de mai sus poate fi Managerul de ferestre dinamic , care citește mesajele de stare pentru a fi afișate din intrarea standard .

Unele programe GUI, mai ales pe sistemele Unix și Unix , folosesc în continuare erori standard pentru a-și scrie mesajele de diagnosticare.

Bibliografie

Elemente conexe

linkuri externe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT