Standardní proudy
Author
Albert FloresStandardní 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. +more Existují normy zahrnující #1950: Fortran|dva, #1970: C a Unix|tři nebo #1968: ALGOL 68|č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|standardní vstup (stdin), #Standardní výstup|standardní výstup (stdout) a #Standardní chybový výstup|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). 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
Standardní vstup je standardizované rozhraní, kterým data vstupují do programu. Data na standardním vstupu program principielně může ignorovat, např. +more 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. +moreh) je stdin a v obdobné knihovně jazyka C++ (iostream) je pro tento účel vyhrazen identifikátor std::cin.
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. +more 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. +moreh je stdout, v iostream tomuto proudu odpovídá označení std::cout.
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ř. +more 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. +moreh je stderr, knihovna iostream standardní chybový výstup vede pod dvěma identifikátory - std::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). +more 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). +more 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 - 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, které tvořit uživateli nepřísluší; 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.
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 upotřebují tzv. filtry (neinteraktivně 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. +more 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é: * stanovit, že na #Standardní vstup|standardní vstup programu se vloží obsah jmenovaného souboru (parametr) nebo #Standardní výstup|standardní výstup podkolony (parametr, uvedený v kulaté závorce) - dle specifikace uživatele (znakem menší - ); * určit, že data ze #Standardní výstup|standardního výstupu (znakem větší - >) nebo #Standardní chybový výstup|standardního chybového výstupu (posloupností 2>) programu se uloží do jmenovaného souboru (parametr), přičemž jeho dosavadní obsah se zahodí; * zadat, že data ze #Standardní výstup|standardního výstupu (zdvojením znaku větší - >>) nebo #Standardní chybový výstup|standardního chybového výstupu (sekvencí 2>>) programu se zapíší do jmenovaného souboru (parametr) za jeho stávající obsah; * formulovat požadavek přesměrování #Standardní výstup|standardního výstupu programu na #Standardní vstup|standardní vstup jiného programu (znakem svislé čáry - |); * při kterékoli z operací vyjmenovaných výše sloučit #Standardní výstup|standardní výstup se #Standardní chybový výstup|standardním chybovým výstupem, a agregovaný tok vydat buď za standardní výstup (posloupností 2>&1), nebo za standardní chybový výstup (sekvencí >&2); * data ze #Standardní výstup|standardního výstupu nebo #Standardní chybový výstup|standardního chybového výstupu - dle specifikace uživatele - potlačit.
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í vstup|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í výstup|standardního výstupu a #Standardní chybový výstup|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|standardní výstup nebo na #Standardní chybový výstup|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ánaHláš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). +more 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 (+ pro pozastavení, + pro ukončení). Toto chování je příznačné zejména pro programy určené pro unixové systémy.
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. +more 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 , 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. +more Desktopové prostředí cílovému programu data předá na #Standardní vstup|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.