Standardní proudy

Z Multimediaexpo.cz

Standardní proudy jsou v informatice implicitně otevřené deskriptory, které slouží procesu (spuštěnému programu) ke styku s jeho okolím. Definují standardní vstup (stdin, typicky propojeny s klávesnicí), standardní výstup (stdout) a standardní chybový výstup (stderr, oba typicky propojeny s terminálem). Termín proud (anglicky stream, file handle) označuje v jazyce C technicky jinou datovou strukturu, než deskriptor, pomocí kterých se v unixových systémech přistupuje k otevřeným souborům, avšak v běžném použití se tyto pojmy často zaměňují.

Standardní proudy jsou jednou ze základních charakteristických vlastností unixových systémů a jejich následovníků. Standardní proudy umožňují snadné přesměrování vstupu a výstupu procesů do souborů, rour a podobně (viz unixový shell).

Obsah

Historické pozadí

Standardní proudy pocházejí z doby, kdy se pro komunikaci člověka s počítačem používal příkazový řádek a jsou jednou ze základních charakteristických vlastností unixových systémů a běhových prostředích jazyka C, C++ a jejich následnících. Standardní proudy používají i moderní programy pro grafické uživatelské rozhraní.

Ve většině operačních systémech předcházejících Unixu se programy musely explicitně připojit k vhodným vstupním a výstupním datům. Na mnoha systémech to mohl být náročný úkol závislý na specifikách operačního systému (získání kontrolního prostředí nastavení, zpřístupnění místních souborových tabulek, určování zamýšlené skupiny dat) a správná obsluha příslušné periférie (snímač štítků, mechanika magnetické pásky, disková mechanika, řádková tiskárna, děrovač štítků, dialogový terminál).

Unix přišel s několika zásadními inovacemi, mezi nimiž byla abstraktní zařízení: ta odstranila nutnost, aby se program musel starat o to, s jakým druhem zařízení komunikuje. Starší operační systémy si vynucovaly na programátorovi znalost struktury záznamu a často i sémantiky dat a detailního ovládání zařízení. Unix eliminoval tyto složitosti pomocí datového proudu, uspořádané sekvence bytů, které mohou být čteny dokud nenastane podmínka konec souboru (EOF). Program může také zapisovat byty bez nutnosti předběžně deklarovat 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 obvykle požadovaly nějaký (obvykle složitý) jazyk (Job Control Language) k vytvoření spojení.

Standardní vstup (stdin)

Standardní vstup jsou data (často text) vstupující do programu. Program žádá o přesun dat použitím operace read. Ne všechny programy požadují vstup, například utilita dir resp. ls (zobrazující jména souborů obsažených v adresáři) vykonává jeho operaci bez jakéhokoliv proudového vstupu dat.

Jestliže není vstup přesměrován, pak je přijímán z terminálu, z něhož byl program spuštěn.

Popisovač souboru (file descriptor) pro standardní vstup je 0 (nula); odpovídající proměnná v <stdio.h> je stdin; proměnná v <iostream> je std::cin.

Standardní výstup (stdout)

Standardní výstup je proud, na který program zapisuje svá výstupní data. Program žádá o přesun dat použitím operace write. Ne všechny programy generují výstup. Například soubor pro přejmenování souboru (označovaný mv, move, ren).

Jestliže není výstup přesměrován, pak se data vypisují na terminál, z něhož byl program spuštěn.

Popisovač souboru pro standardní výstup je 1 (jedna); odpovídající proměnná v <stdio.h> je stdout; proměnná v <iostream> je std::cout.

Standardní chybový výstup (stderr)

Standardní chybový výstup je další výstupní tok, typicky užívaný programy k chybovým zprávám nebo k ladění programu. Je to proud nezávislý na standardním výstupu a může být odděleně přesměrován. Obvykle je cílem terminál, který spustil program (aby se chyba pokud možno zobrazila, i když je standardní výstup přesměrován). Například, výstup programu je přesměrován rourou na vstup dalšího programu, ale chyby z každého programu se zobrazí přímo v terminálu.

Popisovač souboru pro standardní chybu je 2; odpovídající proměnná v <stdio.h> je stderr. V jazyce C++ <iostream> poskytuje dvě proměnné přidružené tímto proudem: std::cerr a std::clog.

Časový vývoj

1950: Fortran

Fortran měl ekvivalent Unixových popisovačů souboru, UNIT=5 pro stdin a UNIT=6 pro stdout.

1960: ALGOL 60

ALGOL 60 byl kritizován kvůli chybějícímu standardnímu přístupu do souboru.

1968: ALGOL 68

ALGOL 68 podporoval vstupní a výstupní zařízení, souhrnně označovaná jako transput. Tento standard zahrnul: stand in, stand out, stand error a stand back.

1970: C a Unix

V programovacím jazyce C byly proudy stdin, stdout a stderr spojeny s Unixovými souborovými deskriptory v pořadí 0, 1 a 2.

1980: C++

V jazyce C++ jsou standardní proudy označovány cin, cout a cerr (jde o objekty definované v iostream).

Grafická uživatelská rozhraní

Grafická uživatelská rozhraní zřídka využívají standardní proudy. Nejbližší obdobou je pravděpodobně operace „zkopíruj a vlož“ (copy and paste). Avšak například správce oken dwm používá stdout k zobrazení stavových informací. Grafické aplikace často vypisují na stdin nebo stderr běhové informace, které jsou však za běžných okolností uživateli skryty (když si aplikaci spustí z menu). Spustí-li si však uživatel aplikaci z příkazového řádku, může v něm nejen tato hlášení vidět, ale použít i další běžné techniky: nastavení proměnných prostředí před spuštěním aplikace – např. proměnnou DISPLAY, pozastavení nebo ukončení aplikace klávesovými zkratkami (CTRL+z, CTRL+c) a podobně.

Související články