Roura (Unix)

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání
Tři programy spojené rourou spuštěné v textovém terminálu

Roura, trubka, anonymní roura, konvenční roura (anglicky pipeline) je v unixových systémech původním nástrojem pro spojování procesů do řetězce pomocí vzájemného propojení standardních proudů tak, že je výstup (nejčastěji stdout) jednoho procesu nasměrován přímo na vstup (stdin) následujícího procesu. Programy, které zpracovávají standardní vstup, nazýváme filtry. Propojení dvou nebo více programů rourami nazýváme kolona. Pojmenování pochází z analogie se skutečnými rourami (trubkami).

Koncept použití rour, který navrhl Douglas McIlroy pro unixový shell, byl později převzat do dalších operačních systémů – MS-DOS, OS/2, Microsoft Windows, OpenVMS, Mac OS X, BeOS. Jedná se o jednosměrnou meziprocesovou komunikaci (IPC), která využívá frontu FIFO sdílenou mezi komunikujícími příbuznými procesy, jež automaticky zaniká po jejich ukončení. Univerzálnější je pojmenovaná roura, pomocí níž lze propojit i nepříbuzné procesy. Moderní implementace umožňují i obousměrné přenosy dat a dokonce i přenos data mezi více počítači (netcat, SSH).

Implementace[editovat | editovat zdroj]

Roura je implementovaná jako (kruhová) fronta o velikosti jednotek 4kB (v Linuxu). Velmi těsné propojení rour se souborových systémem umožňuje pracovat s rourou pomocí základních souborových operací. Zápis a čtení probíhá souborově orientovanými operacemi. Jediným rozdílem oproti souborům je, že s rourou jsou propojeny dva deskriptory otevřených souborů. Jeden je určen pro zápis (vstup do roury) a druhý pro čtení (výstup z roury).

Nad rourou existuje jednoduchá synchronizace, která zapisující proces zablokuje, pokud je roura plná a naopak čtecí proces zablokuje, pokud je prázdná.

Nepojmenované roury[editovat | editovat zdroj]

Nepojmenované (anonymní) roury nemají vlastní identifikátor a jsou přístupné pouze prostřednictvím souborových deskriptorů. Tyto roury lze využít jen pro komunikaci mezi libovolnými procesy, které jsou potomky procesu, jenž rouru vytvořil. Anonymní roury jsou využívány k vytváření tzv. kolon, tedy spojení jednoduchých příkazů pomocí rour za účelem úpravy vstupních dat. Kopírování z jednoho procesu do druhého je prováděno prostřednictvím rutin jádra. Na zdrojové straně zápis rutinou write a na straně druhé čtení rutinou read.

Příklad kolony[editovat | editovat zdroj]

history | grep java | wc -l

Tato kolona vypíše kolikrát uživatel spustil program java.

Další jednoduchý příklad[editovat | editovat zdroj]

V příkladu uvedeném níže příkaz ls vypisuje obsah adresáře a less je interaktivní program, který umožňuje prohlížet obsah svého vstupu po jednotlivých stránkách, vracet se a vyhledávat. Kolona příkazů v příkladu tedy umožní prohlížet celý výpis postupně, i když se nevejde na jednu obrazovku terminálu.

ls -l | less

Vytváření kolon (rour) s využitím příkazů less (nebo jeho jednodušší a starší variantou more) je velmi často používána pro prohlížení potenciálně velkých textových výstupů programů, které by jinak odrolovaly nahoru mimo obrazovku terminálu a byly ztraceny. Stejně tak jsou tyto dva programy využívány uvnitř programů, které prezentují větší objemy textu (například příkaz man).

Složitější příklad[editovat | editovat zdroj]

V následujícím příkladu je implementována kolona příkazů, která zkontroluje překlepy na webové stránce zadané pomocí URL odkazu. Vysvětlení následuje za příkladem (na některých systémech je databáze slov v souboru /usr/share/dict/words).

curl "http://en.wikipedia.org/wiki/Pipeline_(Unix)" | \
sed 's/[^a-zA-Z ]/ /g' | \
tr 'A-Z ' 'a-z\n' | \
grep '[a-z]' | \
sort -u | \
comm -23 - /usr/dict/words

Poznámka: znak zpětného lomítka („\“) umožňuje rozdělit jeden dlouhý řádek na více řádků, i když interpret příkazů je takto chápe jako jeden řádek (jeden složený příkaz, tj. jednu kolonu příkazů) a bude zpracován najednou.

Popis jednotlivých kroků zpracování datového proudu v koloně příkazů:

  1. curl stáhne stránku v podobě HTML (lze použít i příkaz wget)
  2. sed odstraní všechny znaky, které nejsou písmena nebo znak mezery a nahradí je mezerou
  3. tr změní všechna velká písmena na malá a změní všechny mezery v textu na znak konce řádku (takže každé „slovo“ bude na zvláštním řádku)
  4. grep vypíše pouze řádky, které obsahují alespoň jedno písmeno (odstraní prázdné řádky)
  5. sort všechna „slova“ abecedně setřídí a přepínač -u odstraní všechny duplicitní výskyty (každé „slovo“ bude na výstupu jen jednou)
  6. comm nalezne společné řádky v obou souborech, přepínač -23 potlačí výstup řádků, které se vyskytují pouze v druhém vstupním souboru a ty, které se vyskytují v obou souborech, takže na výstupu budou jen ty „slova“, které jsou pouze v prvním souboru. Protože je jako parametr použit znak -, je prvním souborem standardní vstup (výstup předchozího příkazu) a druhým souborem je soubor se slovy /usr/dict/words. Proto budou na výstupu slova, která se nacházejí na webové stránce, ale nejsou obsažena v souboru /usr/dict/words.

Speciální znak svislá čára („|“) na příkazovém řádku znamená, že shell má propojit standardní výstup příkazu na jeho levé straně se standardním vstupem příkazu na jeho pravé straně (dojde k vytvoření roury).

Historie[editovat | editovat zdroj]

Koncept použití rour a použití znaku svislá čára („|“) vynalezl Douglas McIlroy, jeden z autorů prvních unixových shellů, když si všiml, jak mnoho času tráví zpracováním výstupu jednoho programu jako vstupu do jiného programu. V roce 1973 jeho ideu implementoval Ken Thompson, když přidal roury do operačního systému Unix a shellu Thompson shell.[1]

Ikona robota Automator v operačním systému Mac OS X firmy Apple, který také využívá daný koncept, drží rouru.

Ostatní operační systémy[editovat | editovat zdroj]

Související informace naleznete také v článku Roura (software).

Idea roury byla převzata ostatními operačními systémy, často včetně stejného zápisu, jako například DOS, OS/2, Microsoft Windows, OpenVMS, Mac OS X, BeOS a další. Stala se konceptem softwarového designu „roury a filtry“.

Reference[editovat | editovat zdroj]

  1. http://www.linfo.org/pipe.html Pipes: A Brief Introduction by The Linux Information Project (LINFO)

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

  • Standardní proudy
  • Pojmenovaná roura – pojmenovaná roura pro spojení mezi nepříbuznými procesy
  • Soket – pokročilejší IPC s možností obousměrné komunikace i mezi procesy na různých počítačích

Externí odkazy[editovat | editovat zdroj]