Standardní proudy

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Standardní proudy jsou v informatice implicitně otevřené souborové deskriptory, jež procesu (spuštěnému programu) poskytují výchozí rozhraní pro přijímání dat, předávání (produkci) dat a prezentaci nežádoucích jevů, které se při zpracování dat mohou vyskytnout, resp. které jejich řádnému zpracování mohou bránit. Existují normy zahrnující dva, tři nebo čtyři standardní proudy, v nejobvyklejším pojetí se však vyskytují standardní proudy tři — v pořadí předchozího výkladu, pojednávajícího o účelu standardních proudů, se jedná o standardní vstup (stdin), standardní výstup (stdout) a standardní chybový výstup (stderr).

Napříč všemi užitími jsou deskriptory standardních proudů nejvíce patrné v textovém rozhraní a v případě, že proces funguje jako tzv. filtr, jinými slovy neběží interaktivně[1]. V případě textového shellu mají standardní vstup i oba standardní výstupy své výchozí entity — implicitním standardním vstupem je klávesnice a implicitním standardním výstupem i standardním chybovým výstupem obrazovka; obě tato zařízení jsou zastřešena terminálem.

Pro standardní proudy je příznačné, že pracují na úrovni bajtů (nikoli zpráv) a že se jedná o rozhraní (zařízení) znaková, nikoli bloková; při čtení nebo zápisu se tedy není možno vracet (číst znovu tutéž část dat nebo přepisovat jednou předaná data).

Velkým přínosem standardních proudů je možnost zpracování dat v koloně[2] tvořené anonymními rourami. Pointa je v tom, že jednotlivým programům není potřeba vysvětlovat, odkud data mají čerpat a kam je mají předávat — bodem příjmu je standardní vstup a bodem předání standardní výstup, přičemž v uživatelově zadání se v koloně sousední programy oddělí znakem svislé čáry (|); dále je možné vstup prvního programu zadat ze souboru — znakem menší (<) — a výstup posledního do souboru zase uložit — znakem větší (>), popř. jeho zdvojením (>>)[3].

Historické pozadí[editovat | editovat zdroj]

Standardní proudy pocházejí z doby, kdy se pro komunikaci člověka s počítačem používal pouze příkazový řádek, nikoli grafické uživatelské rozhraní, nicméně s nástupem grafických aplikací toto rozhraní nevymizelo, jen není tak zjevné; nemálo aplikací pro desktopová prostředí je jen nástavbou konzolových programů pro jejich uživatelsky přívětivé ovládání, další aplikace standardní proudy používají k záznamu činnosti nebo chyb. Standardní proudy jsou jedním z pilířů unixových systémů, odkud právě pochází jejich dnes nejrozšířenější složení v podobě standardní vstup, standardní výstup, standardní chybový výstup.

Ve většině operačních systémů předcházejících Unixu se programy k vstupním a výstupním zařízením musely připojit, což na mnoha systémech byl náročný úkol, který typicky zahrnoval získání nastavení kontrolního prostředí, zpřístupnění místních souborových tabulek a určení zamýšlené skupiny dat a mimoto vyžadoval správnou obsluhu příslušné periferie (např. snímače štítků, mechaniky magnetické pásky, disketové mechaniky, řádkové tiskárny, děrovače štítků nebo dialogového terminálu). Programátor musel znát strukturu záznamu, často dokonce i sémantiku dat a detaily ovládání zařízení.

Unix přišel s několika zásadními inovacemi, mezi nimiž byl výdobytek zvaný abstraktní zařízení, který programy, potažmo programátory, při komunikaci se zařízeními oprostil od nutnosti tato zařízení rozlišovat. Složitosti byly eliminovány pomocí koncepce datového proudu — uspořádané sekvence bytů, které mohou být čteny, dokud nenastane podmínka konec souboru (EOF). Představena byla také možnost zapisovat bajty bez nutnosti předem oznámit jejich počet a strukturu.

Dalším přínosem Unixu bylo standardní automatické propojování vstupu a výstupu; předchozí operační systémy k vytvoření spojení běžně požadovaly použití nějakého, obvykle poměrně složitého, jazyka, např. Job Control Language (JCL).

Standardní vstup[editovat | editovat zdroj]

Standardní vstup je standardizované rozhraní, kterým data vstupují do programu. Data na standardním vstupu program principielně může ignorovat, např. tehdy, když je spuštěn s neplatnou kombinací parametrů; programy, které se standardním vstupem nepracují, kupř. ty, jejichž agendou je kopírování, přejmenování, přesunování nebo mazání souborů, datům na něm pozornost nevěnují nikdy.

Není-li standardní vstup přesměrován, je připojen k entitě, jíž byl program spuštěn (nejčastěji je touto entitou terminál).

O přesun dat ze standardního vstupu do paměťového prostoru programu tento žádá použitím operace (systémového volání) read nad souborovým deskriptorem 0. Pojmenování souborového deskriptoru standardního vstupu ve standardní knihovně jazyka C pro práci se vstupem a výstupem (stdio.h) je stdin a v obdobné knihovně jazyka C++ (iostream) je pro tento účel vyhrazen identifikátor std::cin.

Standardní výstup[editovat | editovat zdroj]

Standardní výstup je standardizované rozhraní pro předávání výstupních dat. Žádný program není povinen data na standardní výstup zapisovat; to bez ohledu na vstupní data a parametry, s nimiž byl spuštěn. Existují programy, jež pracují se standardním vstupem a nepoužívají standardní výstup, i programy, které ignorují standardní vstup a jejichž plody odcházejí standardním výstupem; příkladem prvního případu může být klient systému řízení báze dat, který příkazy přijaté ze standardního vstupu vykoná nad databází, za příklad druhého extrému lze pokládat program pro výpis obsahu adresáře.

I pro standardní výstup platí, že není-li přesměrován, je napojen na entitu, jíž byl program spuštěn (nejčastěji je touto entitou terminál).

O to, aby data skrze standardní výstup převzal operační systém, jej program žádá uplatněním operace (systémového volání) write nad souborovým deskriptorem 1. Identifikátor standardního výstupu ve stdio.h je stdout, v iostream tomuto proudu odpovídá označení std::cout.

Standardní chybový výstup[editovat | editovat zdroj]

Standardní chybový výstup je další výstupní tok, který je zcela nezávislý na standardním výstupu, s nímž jej pojí jen podobnost názvu a směr proudění dat (z pohledu programu). Tento proud byl předurčen k distribuci chybových hlášení, v kontextu kolony se jím chyby vypisují do terminálu, ale lze jej použít k jakémukoli účelu — prezentaci kteréhokoli druhu informací, kupř. je možné vypisovat časy, ve kterých program vstoupí do jednotlivých fází zpracování vstupu. Programy z výchozí sady programů v unixových operačních systémech ctí pravidlo, že zprávu zaslanou na standardní chybový výstup uvozují svým názvem a dvojtečkou. Standardní chybový vstup lze přesměrovat na standardní výstup.

Rovněž standardní chybový výstup je v případě absence svého přesměrování navázán na entitu, jíž byl program spuštěn (nejčastěji je touto entitou terminál).

Předání dat na standardní chybový výstup program signalizuje zavoláním operace (systémového volání) write nad souborovým deskriptorem 2. Název standardního chybového výstupu ve stdio.h je stderr, knihovna iostream standardní chybový výstup vede pod dvěma identifikátorystd::cerr a std::clog.

Časový vývoj[editovat | editovat zdroj]

1950: Fortran[editovat | editovat zdroj]

Fortran měl ekvivalent unixových souborových deskriptorů, ale jen pro standardní vstup (UNIT=5) a standardní výstup (UNIT=6).

1960: ALGOL 60[editovat | editovat zdroj]

ALGOL 60 standardní proudy neměl, a byl kvůli tomu kritizován.

1968: ALGOL 68[editovat | editovat zdroj]

ALGOL 68 podporoval vstupní a výstupní zařízení, tato byla souhrnně označována jako transput. Entity standardních proudů nesou pojmenování stand in, stand out, stand error a stand back.

1970: C a Unix[editovat | editovat zdroj]

V jazyce C byly proudy stdin, stdout a stderr spojeny s unixovými souborovými deskriptory 0, 1 a 2 (v uvedeném pořadí).

1980: C++[editovat | editovat zdroj]

V jazyce C++ jsou standardní proudy označovány std::cin, std::cout a std::cerr (jde o identifikátory definované v knihovně iostream).

Desktopová prostředí[editovat | editovat zdroj]

Aplikace s grafickým uživatelským rozhraním, vyjma těch, které jsou jen grafickým „obalem“ textových programů[4], standardní proudy využívají zřídka. Jeden z případů, v němž se tak děje, představuje správce oken dwm, jenž používá standardní výstup k zobrazování stavových informací. Běhové informace, které desktopové aplikace na standardní výstup nebo standardní chybový výstup zapisují, pokud k tomu dochází, jsou ovšem za běžných okolností — při spuštění aplikace z menu — uživateli skryty; hlášení uživatel uvidí tehdy, když aplikaci spustí z terminálu (samozřejmě za předpokladu, že její výstupy nepřesměruje).[5]

Něčím jiným je vymoženost některých desktopových prostředí, nacházející se v dialogovém oknu funkce Uložit jako (anglicky Save As), která umožňuje přenést výstupní data jednoho programu do programu jiného bez toho, aby tato (byť jen na krátký okamžik) byla uchována v souboru adresovatelném v souborovém systému, podobně jako toho lze docílit využitím schránky; desktopové prostředí cílovému programu data předá na standardní vstup. Tato funkce naplňuje charakteristické znaky roury.

Za obdobu standardních proudů v desktopových prostředích lze v jistém smyslu považovat rovněž výše zmíněnou schránku.

Související články[editovat | editovat zdroj]

  • Neinteraktivní běh znamená, že proces v průběhu svého vykonávání nevyžaduje zásah uživatele, resp. na jeho vstup nečeká. Příkladem takových zásahů mohou být dotazy na potvrzení smazání jednotlivých souborů. O interaktivnosti běhu nerozhoduje operační systém a přímo ani uživatel (pokud ano, nanejvýš parametrizací programu); interaktivnost běhu je dána tím, jak se program chová.
  • Zpracováním dat v koloně se rozumí využití standardizovaných víceúčelových programů (např. výpis obsahu adresáře nebo vyfiltrování řádků obsahujících specifikovaný výraz) ke splnění úlohy, na kterou speciální program neexistuje (kupř. získání seznamu všech souborů a adresářů ve složce takových, jež začínají písmenem „A“). Smyslem je ušetření práce s vytvářením, pojmenováváním, ukládáním, distribucí atd. takových programů.
  • Zdvojením znaku větší (>) se v přesměrování výstupu vyjadřuje požadavek na zachování původních dat cílového souboru — zápis se provede za jeho stávající obsah.
  • Grafické nástavby textových programů lze s úspěchem hledat např. mezi vypalovacími a archivačními programy v prostředí linuxových distribucí.
  • Spuštění aplikace z terminálu vedle možnosti sledovat hlášení o činnosti programu uživateli otevírá cestu i k dalším technikám, jako např. nastavení proměnných prostředí před spuštěním aplikace (kupř. DISPLAY) nebo pozastavení či ukončení aplikace klávesovými zkratkami (Ctrl+Z pro pozastavení, Ctrl+C pro ukončení).