Standardní streamy - Standard streams

V počítačovém programování jsou standardní toky propojeny vstupní a výstupní komunikační kanály mezi počítačovým programem a jeho prostředím, když začíná provádění. Tři připojení vstupu/výstupu (I/O) se nazývají standardní vstup ( stdin ), standardní výstup ( stdout ) a standardní chyba ( stderr ). Původně I/O probíhalo prostřednictvím fyzicky připojené systémové konzoly (vstup přes klávesnici, výstup přes monitor), ale standardní streamy to abstrahují. Když je příkaz spuštěn prostřednictvím interaktivního shellu , proudy jsou obvykle připojeny k textovému terminálu, na kterém běží shell, ale lze jej změnit přesměrováním nebo potrubím . Obecněji řečeno, podřízený proces dědí standardní toky svého nadřazeného procesu .

aplikace

Standardní toky pro vstup, výstup a chybu

Uživatelé obecně znají standardní toky jako vstupní a výstupní kanály, které zpracovávají data přicházející ze vstupního zařízení nebo která zapisují data z aplikace. Data mohou být textová s jakýmkoli kódováním nebo binární data . V mnoha moderních systémech je standardní chybový tok programu přesměrován do souboru protokolu, obvykle pro účely analýzy chyb.

Toky lze použít k řetězení aplikací, což znamená, že výstupní proud jednoho programu lze přesměrovat tak, aby byl vstupním proudem do jiné aplikace. V mnoha operačních systémech je to vyjádřeno vypsáním názvů aplikací oddělených znakem svislého pruhu, proto se často nazývá znak potrubí . Dobře známým příkladem je použití aplikace stránkování , například více , poskytující uživatelskou kontrolu nad zobrazením výstupního proudu na displeji.

Pozadí

Ve většině operačních systémů předcházejících Unixu se programy musely explicitně připojit k příslušným vstupním a výstupním zařízením. Složitosti specifické pro operační systém způsobily, že to byl únavný programovací úkol. Na mnoha systémech bylo nutné získat kontrolu nad nastavením prostředí, přistupovat k místní tabulce souborů, určit zamýšlenou sadu dat a správně zacházet s hardwarem v případě čtečky děrovacích karet , magnetické páskové jednotky , diskové jednotky , řádkové tiskárny , děrovače karet nebo interaktivní terminál.

Jedním z několika převratných pokroků Unixu byla abstraktní zařízení , což odstranilo potřebu programu vědět nebo se starat o to, s jakými zařízeními komunikuje. Starší operační systémy vnucovaly programátorovi strukturu záznamů a často neortogonální sémantiku dat a ovládání zařízení. Unix tuto složitost odstranil konceptem datového proudu: uspořádané posloupnosti datových bytů, které lze číst až do konce souboru . Program může také zapisovat bajty podle potřeby a nemusí a nemůže snadno deklarovat jejich počet nebo seskupení.

Dalším unixovým průlomem bylo automatické přiřazení vstupu a výstupu k terminálové klávesnici a terminálovému displeji, ve výchozím nastavení-program (a programátor) neudělal absolutně nic pro vytvoření vstupu a výstupu pro typický program vstup-proces-výstup (pokud nevybral odlišné paradigma). Naproti tomu předchozí operační systémy obvykle k navázání spojení vyžadovaly nějaký - často složitý - jazyk pro řízení úloh , nebo ekvivalentní zátěž musel program organizovat.

Vzhledem k tomu, že Unix poskytoval standardní toky, runtime prostředí Unix C bylo povinno jej také podporovat. Výsledkem je, že většina běhových prostředí C (a potomků C ), bez ohledu na operační systém, poskytuje ekvivalentní funkce.

Standardní vstup (stdin)

Standardní vstup je stream, ze kterého program čte jeho vstupní data. Program požaduje přenos dat pomocí operace čtení . Ne všechny programy vyžadují vstup streamu. Například programy dir a ls (které zobrazují názvy souborů obsažených v adresáři) mohou přijímat argumenty příkazového řádku , ale provádět své operace bez zadávání dat streamu.

Pokud není přesměrován , standardní vstup se dědí z nadřazeného procesu. V případě interaktivního prostředí je to obvykle spojeno s klávesnicí .

Deskriptor souboru pro standardní vstup je 0 (nula); POSIX <unistd.h> definice je STDIN_FILENO; odpovídající proměnná C <stdio.h> je FILE* stdin; podobně je proměnná C ++ <iostream>std::cin .

Standardní výstup (standardní výstup)

Standardní výstup je proud, do kterého program zapisuje svá výstupní data. Program požaduje přenos dat pomocí operace zápisu . Ne všechny programy generují výstup. Například příkaz přejmenovat soubor (různě nazývaný mv , move nebo ren ) o úspěchu mlčí.

Pokud není přesměrován , standardní výstup se dědí z nadřazeného procesu. V případě interaktivního shellu je to obvykle textový terminál, který program inicioval.

Deskriptor souboru na standardní výstup je 1 (jedna); POSIX <unistd.h> definice je STDOUT_FILENO; odpovídající proměnná C <stdio.h> je FILE* stdout; podobně je proměnná C ++ <iostream>std::cout .

Standardní chyba (stderr)

Standardní chyba je další výstupní proud, který programy obvykle používají k výstupu chybových zpráv nebo diagnostiky. Je to stream nezávislý na standardním výstupu a lze jej přesměrovat samostatně. Tím je vyřešen problém semi predikátu , což umožňuje rozlišit výstup a chyby, a je to analogické s funkcí vracející dvojici hodnot-viz problém s polopredikátem: návrat s více hodnotami . Obvyklým cílem je textový terminál, který spustil program, aby poskytl nejlepší šanci být viděn, i když je přesměrován standardní výstup (takže není snadno pozorován). Například výstup programu v kanálu je přesměrován na vstup dalšího programu, ale chyby z každého programu stále jdou přímo do textového terminálu.

Je přijatelné a normální nasměrovat standardní výstup a standardní chybu na stejné místo určení, například na textový terminál. Zprávy se zobrazují ve stejném pořadí, v jakém je program píše, pokud nejde o ukládání do vyrovnávací paměti . Například v běžných situacích je standardní tok chyb bez vyrovnávací paměti, ale standardní výstupní tok je ukládán do vyrovnávací paměti; v tomto případě se text zapsaný na standardní chybu později může objevit na terminálu dříve, pokud vyrovnávací paměť standardního výstupního proudu ještě není plná.

Popisovač souborů pro standardní chyba je definován POSIX jako 2 (dvě); <unistd.h> hlavičkový soubor obsahuje symbol STDERR_FILENO; odpovídající proměnná C <stdio.h> je FILE* stderr. Standardní hlavička C ++ <iostream> poskytuje dvě proměnné přidružené k tomuto proudu: std::cerra std::clogprvní z nich je bez vyrovnávací paměti a druhý pomocí stejného mechanismu vyrovnávací paměti jako všechny ostatní streamy C ++.

Mušle ve stylu Bourne umožňují přesměrování standardní chyby na stejné místo určení, na které je směrován standardní výstup

 2>&1

Prostředí ve stylu csh umožňují přesměrování standardní chyby na stejné místo určení, na které je směrován standardní výstup

 >&

Standardní chyba byla do Unixu přidána v 70. letech 20. století poté, co několik zbytečných běhů fototypizace skončilo tím, že místo zobrazení na uživatelském terminálu byly vysazeny chybové zprávy.

Časová osa

1950: Fortran

Fortran má ekvivalent unixových deskriptorů souborů: Podle konvencí mnoho implementací Fortranu používá čísla jednotek UNIT=5pro stdin, UNIT=6pro stdout a UNIT=0pro stderr. V Fortran-2003, vnitřní ISO_FORTRAN_ENVmodul byl standardizován zahrnout pojmenované konstanty INPUT_UNIT, OUTPUT_UNITa ERROR_UNITna portably specifikovat počty jednotek.

! FORTRAN 77 example
      PROGRAM MAIN
        INTEGER NUMBER
        READ(UNIT=5,*) NUMBER
        WRITE(UNIT=6,'(A,I3)') ' NUMBER IS: ',NUMBER
      END
! Fortran 2003 example
program main
  use iso_fortran_env
  implicit none
  integer :: number
  read (unit=INPUT_UNIT,*) number
  write (unit=OUTPUT_UNIT,'(a,i3)') 'Number is: ', number
end program

1960: ALGOL 60

ALGOL 60 byl kritizován za to, že nemá standardní přístup k souborům.

1968: ALGOL 68

Vstupní a výstupní zařízení ALGOL 68 byly souhrnně označovány jako transput. Koster koordinoval definici transput standardu. Model zahrnoval tři standardní kanály: stand in, stand outa stand back.

Příklad
# ALGOL 68 example #
main:(
  REAL number;
  getf(stand in,($g$,number));
  printf(($"Number is: "g(6,4)"OR "$,number)); # OR #
  putf(stand out,($" Number is: "g(6,4)"!"$,number));
  newline(stand out)
)
Vstup: Výstup:
3.14159
Number is: +3.142 OR Number is: +3.142!

1970: C a Unix

V programovacím jazyce C jsou standardní vstupní, výstupní a chybové proudy připojeny ke stávajícím deskriptorům souborů Unix 0, 1 a 2. V prostředí POSIX by místo kouzelných čísel měly být použity definice < unistd.h > STDIN_FILENO , STDOUT_FILENO nebo STDERR_FILENO . K dispozici jsou také ukazatele souborů stdin , stdout a stderr .

Ken Thompson (návrhář a implementátor původního operačního systému Unix) upravil ve verzi 5 Unix řazení tak, aby akceptovalo „-“ jako standardní vstup, který se rozšířil do dalších nástrojů a ve verzi 8 se stal součástí operačního systému jako speciální soubor . Diagnostika byla součástí standardního výstupu prostřednictvím verze 6 , načež Dennis M. Ritchie vytvořil koncept standardní chyby.

1995: Java

V Javě jsou standardní toky označovány System.in(pro stdin), System.out(pro stdout) a System.err(pro stderr).

public static void main(String args[]) {
    try {
        BufferedReader br = 
          new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        double number = Double.parseDouble(s);
        System.out.println("Number is:" + number);
    } catch (Exception e) {
        System.err.println("Error:" + e.getMessage());
    }
}

2000s: .NET

V C# a dalších jazycích .NET jsou na standardní streamy odkazováno pomocí System.Console.In(pro stdin), System.Console.Out(pro stdout) a System.Console.Error(pro stderr). Základní možnosti čtení a zápisu pro stdin a stdout streamy jsou také přístupné přímo přes třídu System.Console(např. System.Console.WriteLine()Lze použít místo System.Console.Out.WriteLine()).

System.Console.In, System.Console.Outa System.Console.Errorjsou System.IO.TextReader(stdin) a System.IO.TextWriter(stdout, stderr) objekty, které umožňují přístup pouze k podkladovým standardním streamům na textovém základě. Plná binární přístup ke standardním proudy musí být provedeno prostřednictvím System.IO.Streamobjektů vrácených System.Console.OpenStandardInput(), System.Console.OpenStandardOutput()a System.Console.OpenStandardError()resp.

// C# example
public static int Main(string[] args)
{
    try {
        string s = System.Console.In.ReadLine();
        double number = double.Parse(s);
        System.Console.Out.WriteLine("Number is: {0:F3}", number);
        return 0;

    // If Parse() threw an exception
    } catch (ArgumentNullException) { 
        System.Console.Error.WriteLine("No number was entered!");
    } catch (FormatException) {
        System.Console.Error.WriteLine("The specified value is not a valid number!");
    } catch (OverflowException) {
        System.Console.Error.WriteLine("The specified number is too big!");
    }

    return -1;
}
' Visual Basic .NET example

Public Function Main() As Integer
    Try
        Dim s As String = System.Console.[In].ReadLine()
        Dim number As Double = Double.Parse(s)
        System.Console.Out.WriteLine("Number is: {0:F3}", number)
        Return 0

    ' If Parse() threw an exception
    Catch ex As System.ArgumentNullException
        System.Console.[Error].WriteLine("No number was entered!")
    Catch ex2 As System.FormatException
        System.Console.[Error].WriteLine("The specified value is not a valid number!")
    Catch ex3 As System.OverflowException
        System.Console.[Error].WriteLine("The specified number is too big!")
    End Try

    Return -1
End Function

Při použití System.Diagnostics.Process třídy je možné využít instance vlastnosti StandardInput , StandardOutputa StandardErrorz této třídy pro přístup ke standardní proudy procesu.

GUI

Grafická uživatelská rozhraní (GUI) ne vždy využívají standardní toky; dělají, když jsou GUI obaly podkladových skriptů a/nebo konzolových programů, například GUI správce balíčků Synaptic , který zabalí příkazy apt v Debianu a/nebo Ubuntu. GUI vytvořená pomocí skriptovacích nástrojů, jako je Zenity a KDialog by KDE project, používají stdin, stdout a stderr a jsou založeny spíše na jednoduchých skriptech než na kompletním GUI naprogramovaném a kompilovaném v C/C ++ pomocí Qt , GTK nebo jiného ekvivalentního proprietárního widgetu rámec.

Nabídka služeb , jak je implementována na NeXTSTEP a Mac OS X , je také analogická standardním streamům. V těchto operačních systémech mohou grafické aplikace poskytovat funkce prostřednictvím systémové nabídky, která pracuje s aktuálním výběrem v grafickém uživatelském rozhraní, bez ohledu na to, v jaké aplikaci.

Některé programy GUI, primárně na Unixu, stále zapisují informace o ladění do standardní chyby. Ostatní (například mnoho unixových přehrávačů médií) mohou číst soubory ze standardního vstupu. Oblíbené programy pro Windows, které kromě oken GUI otevírají samostatné okno konzoly, jsou emulátory pSX a DOSBox .

Server GTK může použít stdin jako komunikační rozhraní s interpretovaným programem k realizaci GUI.

The Common Lisp Interface manažer paradigma „dárky“ prvky GUI zaslána delší výstupního proudu.

Viz také

Reference

Prameny

externí odkazy