Standardní proudy

Standardní vstup, standardní výstup a standardní proudy obecně je v informatice koncept, který poskytuje každému programu sadu okamžitě použitelných rozhraní pro výstup a vstup dat, obvykle v textovém tvaru. Vychází z pozorování, že většina programů určených pro prostředí příkazového řádku potřebuje někam vypisovat své výsledky, a z myšlenky, že výstup jednoho programu je často vhodné zpracovat jiným programem. Tvůrci operačního systému Unix navrhli jednoduchý způsob, kterým může uživatel v okamžiku spuštění programu určit, na jaké zařízení má směřovat výstup programu, z jakého souboru má program číst vstupní data, případně jak si mají dva nebo více programů data předávat. Tento koncept byl převzat do dalších operačních systémů (DOS, Microsoft Windows, OpenVMS).

Standardní proudy bývají implementovány jako sada souborových deskriptorů, 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).

Se standardními proudy se zachází jako se zařízeními znakovými, nikoli blokovými; při čtení nebo zápisu se tedy není možno vracet (číst znovu tutéž část dat nebo přepisovat jednou předaná data). Standardní proudy pracují na úrovni bajtů (nikoli zpráv) a jejich deskriptory jsou implicitně otevřené.

Velkým přínosem standardních proudů je možnost zpracování dat v koloně (dle návrhového vzoru roury a filtry).[1] 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.

Standardní vstup

Na tuto kapitolu je přesměrováno heslo Standardní vstup.

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í v principu nikdy.

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

Na tuto kapitolu je přesměrováno heslo Standardní výstup.

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.

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

Na tuto kapitolu je přesměrováno heslo Standardní chybový výstup.

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 (tzv. tradiční unixové programy) ctí pravidlo, že zprávu zaslanou na standardní chybový výstup uvozují svým názvem a dvojtečkou. Standardní chybový vstup je možno přesměrovat na standardní výstup.

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.

Historické pozadí

Standardní proudy pocházejí z doby, kdy se pro komunikaci člověka s počítačem používal pouze příkazový řádek; jsou jedním z pilířů na textové rozhraní hodně dbajících 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 též 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, kupř. Job Control Language (JCL).

Časový vývoj

1950: Fortran

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

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

1968: ALGOL 68

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

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++

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

Podpora standardních proudů v shellech

Ačkoli standardní proudy jsou záležitostí operačních systémů, které ve svých datových strukturách pro procesy musí vyhradit místo jejich souborovým deskriptorům, a věcí programovacích jazyků, jež pro standardní proudy musí mít rozhraní, resp. vést jejich identifikátory, důležitým aspektem standardních proudů je možnost jejich využití v koloně, přičemž v možnostech jejich tvorby se kategoricky liší shelly[2]textové shelly pro specifikaci kolon obecně nabízejí nástroje, zatímco pro běh kolony v grafických shellech kolona musí být pevně zakotvena v zastřešujícím programu[3], které tvořit uživateli nepřísluší[4]; jádro rozdílu je v tom, že v příkazovém řádku je kam další programy v koloně udat, kdežto desktopová prostředí se vyznačují spouštěním programů myší (z menu nebo ikonou na ploše), u čehož obdobná možnost není k dispozici[5].

Kvůli prostředkům pro pohodlné operativní kombinování programů do kolon jsou to právě textová rozhraní, prostřednictvím kterých se v individuálních případech[6] upotřebují tzv. filtry (neinteraktivně[7] běžící programy zpracovávající text).

Následující část výkladu se věnuje specifikům podpory standardních proudů v shellech a charakteru jejich využití zvlášť v textových a zvlášť v grafických shellech kovanými programy.

Textová rozhraní

Stran standardních proudů jsou textová rozhraní charakteristická tím, že pro standardní vstup i oba standardní výstupy vymezují 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.

Jak už bylo řečeno výše, textové shelly typicky disponují prostředky pro uživatelsky přívětivé řazení programů do kolon. Tyto jsou podmnožinou funkcí, jež se nazývají přesměrování, příp. přesměrování vstupu a výstupu.

Přesměrování standardních proudů

Přesměrováním se lze nejen odchýlit od klávesnice a obrazovky jakožto výchozích zařízení pro vstup a výstup dat v příkazovém řádku — zpravidla (podle výbavy shellu) je možné:

Uvedené řídicí znaky a jejich posloupnosti nejsou závazné, ale jsou de facto standardem.

Historie pamatuje také to, že standardní výstupy bylo namísto do souboru možno přesměrovat i na zařízení, např. tiskárnu nebo sériový nebo paralelní port.

Desktopová prostředí

Kvůli tomu, že práce se standardním vstupem je vlastní neinteraktivním programům (programům bez uživatelského rozhraní), které se z desktopových prostředí přímo nespouštějí, a v desktopových prostředích pro standardní proudy neexistují výchozí entity uživatelského rozhraní, čili data ze standardního výstupu a standardního chybového výstupu z aplikace spuštěné mimo terminál se ztrácejí, není využití standardních proudů aplikacemi s grafickým uživatelským rozhraním populární; to se ovšem týká i interaktivních aplikací v textovém režimu, např. počítačových her.

Uplatnění standardních proudů grafickými aplikacemi lze rozdělit do několika skupin.

Výstup běhových informací

První typ tvoří aplikace, které na standardní výstup nebo na standardní chybový výstup, příp. na oba tyto výstupy, zapisují záznam činnosti nebo chyb; nezajímají se přitom o to, zda takto předaná data budou zpracována[8]. Toto chování je příznačné zejména pro programy určené pro unixové systémy[9].

Příkladem je správce oken dwm, jenž používá standardní výstup k distribuci stavových informací.

Grafický obal neinteraktivního programu

Jiný způsob využití standardních proudů aplikacemi s grafickým uživatelským rozhraním reprezentují ty programy, jejichž funkčnost je založena na konzolovém programu. Tyto fungují jen jako uživatelsky přívětivé nástavby, zajišťující snadné ovládání neinteraktivního programu, plně ovladatelného z příkazového řádku. Standardní proudy přicházejí ke slovu při spolupráci s tímto neinteraktivním programem.

Reprezentanty programů spadajících do této kategorie lze s úspěchem hledat kupř. mezi archivačními a vypalovacími programy v linuxových distribucích, jež jsou opět unixovými systémy.

Standardní proudy v přeneseném významu

Dále je v popisu uplatnění standardních proudů v desktopových prostředích namístě zmínit 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á dovoluje 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 tzv. schránky. Desktopové prostředí cílovému programu data předá na standardní vstup.

Výše představený výdobytek je prvkem výbavy desktopových prostředí RISC OS a ROX Desktop.

Schránka

Za obdobu standardních proudů v desktopových prostředích lze v jistém smyslu považovat rovněž již dotčenou schránku.

Související články

Reference

  1. 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ů.
  2. Shell je program, který v počítači vytváří rozhraní pro uživatele. Proto je pro uživatele nevyhnutelný, potažmo je relevantní se o něm zmiňovat v kontextu standardních proudů, s nimiž také přichází do styku uživatel.
  3. Takový program může být vytvořen výhradně za účelem ustavení kolony a je možné jej spouštět i v řádkových shellech.
  4. Tvorbu programů nelze pokládat za činnost hodnou řadového uživatele — tou je jejich používání.
  5. Dialogy v desktopových prostředích pro spouštění programů zadáním textu princip grafického uživatelského rozhraní přinejmenším v určitém smyslu popírají.
  6. Individuálními případy zde autor míní úlohy, které se ve stejné podobě neopakují dost často na to, aby se z důvodu jejich plnění vyplatilo vytvořit stálý program.
  7. 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á.
  8. Hlášení uživatel uvidí právě tehdy, když aplikaci spustí z terminálu (samozřejmě za předpokladu, že její výstupy nepřesměruje). 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í).
  9. Unixové operační systémy o sobě, zvláště v konkurenčním boji s produkty Windows firmy Microsoft, prohlašují, že jsou systémy, jež plně podporují jak uživatelské rozhraní grafické, tak textové.