Fork-exec

Z Wikipedie, otevřené encyklopedie
Skočit na navigaci Skočit na vyhledávání

Fork-exec je technika používaná operačním systémem Unix a systémy z něho odvozenými k vytvoření nového procesu řízeného jiným programem. Zatímco systémové volání fork vytvoří přesnou kopii aktuálního procesu, systémové volání exec načte do paměti procesu zvolený program a předá mu řízení. Výhodou tohoto přístupu je, že kopie procesu může připravit běhové prostředí pro program spuštěný pomocí exec. Nevýhodou může být vyšší režie (např. pokud velký program spouští malý, zbytečně se alokuje a kopíruje velká oblast paměti), kterou však moderní operační systémy do velké míry eliminují, například použitím technologie Copy-on-write.

Jiné systémy používají pro spuštění nového procesu řízeného jiným programem jedno systémové volání, např. v případě operačního systému Microsoft Windows některou variantu volání spawn.

Popis[editovat | editovat zdroj]

Systémová služba fork() vytvoří přesnou kopii procesu, který ji vyvolal. Tato kopie zahrnuje i stav procesoru (obsah registrů), operační paměť přidělenou procesu a některá systémová data, včetně tabulky otevřených souborů. Nový proces dostane vlastní číslo procesu (PID). K rozlišení rodičovského procesu od potomka slouží návratová hodnota volání fork(), která je u potomka nulová, u rodiče je rovna PID potomka (nikdy není nulové).

V některých případech oba dva procesy pokračují v provádění stejného spustitelného souboru (to se často používá např. u síťových serverů, kdy rodič čeká na otevření spojení, a pro obsluhu každého spojení vytvoří potomka), v jiných případech jeden z nich spustí vyvoláním systémové služby exec() jiný program.

Zavoláním některé varianty systémové služby exec() bude obsah operační paměti přidělené procesu přepsán kódem nového programu, kterému bude předáno řízení. Tím dojde ke smazání všech dat původního programu umístěných v operační paměti a jejich přepsání daty nového programu, systémové tabulky jako deskriptory souborů však jsou zachovány (pokud je původní program explicitně neoznačil jako close-on-exec). To umožňuje, aby rodičovský proces vytvořil rouru, kterou může používat ke komunikaci s nově spuštěným programem.

Operační systém Microsoft Windows model fork-exec nepodporuje, protože nemá systémové volání ekvivalentní volání fork().

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku Fork-exec na anglické Wikipedii.