Komunikace mezi procesy
Z MiS
- Při programování úlohy postupujeme, jako by náš program byl jediný, který v počítači běží.
- Procesy se musí mít zcela oddělenou paměť, aby nemohlo omylem či záměrně dojít k poškození dat nebo dokonce kódu procesu jiným procesem (například malwarem, nebo prostě chybou v jiném procesu).
- Jak si ale mohou procesy vyměňovat data, pokud je to potřeba?
- Poznámka
Vlákna jednoho procesu mají společný datový segment — tedy sdílí společnou paměť. Sdílení dat mezi vlákny tedy problém není, stačí použít společné proměnné.
Proces ale má svůj virtuální paměťový prostor a ostatní procesy jeho proměnné nevidí (viz heslo Přístup procesů do paměti).
- Dále uvedeme způsoby, jak procesy mohou navzájem předávat data, když je to potřeba.
Obsah |
Soubory
- Diskový prostor je pro všechny procesy společný, jeden proces tedy může zapsat data do souboru a druhý proces je z téhož souboru může přečíst.
Roura (pipe)
- Rouru znáte z příkazového řádku — je to znak
|
, který píšete mezi dva příkazy. - (Viz Vstup a výstup procesů, přesměrování.)
- Například:
ls | sort | head
- Roura je ve skutečnosti speciální virtuální „soubor“ určený jen pro komunikaci mezi procesy.
- Pokud zpracovávající proces vpravo od znaku
|
nestíhá zpracovávat data, je generující proces (ten vlevo od znaku|
) pozastaven (blocked — v rámci našeho rozdělení stavů je to stav Sleep/wait).
Síťové rozhraní (socket)
- Procesy mohou komunikovat prostřednictvím sítě.
- I když běží na jednom počítači, mohou použít jako cílovou IP adresu „místní smyčku“ (localhost, 127.0.0.1).
- Využívá se například u linuxových grafických rozhraní.
- Výhoda: relativně snadný převod na síťovou aplikaci, pokud je to v budoucnu potřeba.
Proměnné prostředí
- Proměnné prostředí (environment variables) se kopírují z rodičovských procesů na dceřiné.
- Jedná se například o proměnnou
PATH
, viz Proměnné prostředí. - Proces A tedy může nastavit proměnnou prostředí a pokud A později spustí další (dceřinný) proces B, může si proces B hodnotu proměnné přečíst.
- Tímto způsobem se často předává informace o nastavení cest k významným adresářům. (Což lze poté využít pro komunikaci prostřednictvím souborů).
Signály
- Speciální mechanismus pro komunikaci mezi operačním systémem a procesy navzájem.
- Signály může posílat i uživatel ručně prostřednictvím příkazu
kill
(viz také Nástroje pro práci s procesy).
Příklady signálů
- TERM (TERMinate)
- požádá aplikaci o ukončení
- Tento signál vyšle i „zavírací tlačítko“ v pravém horním rohu okna aplikace v GUI.
- INT (INTerrupt)
- Násilné ukončení.
- Odpovídá stisku kombinace „Ctrl-C“ v příkazovém řádku Linuxu. (Pozor, nepleťte s kopírováním do schránky, což je význam Ctrl-C v grafickém prostředí.)
- KILL
- Aplikace je „zabita“ — ukončena bez možnosti zareagovat na signál.
- Tento signál se neposílá procesu, zpracuje přímo operační systém — zruší proces a uvolní jeho paměť. Může ale dojít ke ztrátě dat, pokud proces právě pracoval s diskem či posílal data jinému procesu.
- NOHUP (NO HangUP)
- Proces neskončí při ukončení rodičovského procesu.
Adresář /proc
- Jedná se o speciální virtuální adresář, kde lze zjistit informace o běžících procesech.
- Viz Adresář /proc.
Schránka operačního systému
- Schránku znáte z grafického prostředí.
- Kombinace kláves Ctrl-C umístí data v rámci jednoho procesu do „schránky“, ve druhém procesu pak kombinace Ctrl-V data ze schránky vyzvedne.
Související stránky
- Nástroje pro práci s procesy, Přístup procesů do paměti, Adresář /proc, Nástroje pro práci s procesy