Spouštění procesů v C

Motivací k programování víceprocesových aplikací může být několik. V dřívějších dobách, kdy počítače ještě neměly potřebný výkon, bylo možné spustit vždy pouze jeden proces. Uživatel proto musel vždy čekat, než se mu například stáhne obsah diskety na disk, aniž by mohl dělat cokoliv jiného, než pozorovat, jak se kopíruje. Tato doba už je naštěstí dávno pryč a nyní je možné dělat celou řadu jiných a lepších aktivit během kopírování.

Po spuštění standardní aplikace napsané v C, běží aplikace jako jeden proces. Každé čtení/zápis do paměti proto zastaví celou aplikaci. Aby jsme se tomu předešli můžeme aplikaci takzvaně rozvětvit. K rozvětvení aplikace slouží systémové volání obstarané funkcí fork() z knihovny unistd.h. Po zavolání fork() vzniknout dva totožné procesy, každý ale s jiným PID. Tyto dva procesy se začnou vykonávat paralelně od místa, kde bylo voláno fork(), budou tedy vykonávat stejný program.

Ukázka jednoduchého zavolání fork(). Program do terminálu dvakrát vypíše Job completed.

Aby rozvětvení do dvou procesů provedlo něco smysluplnějšího, než pouhé dvojí provedení jedné úlohy, je potřeba rozlišit, zda se část úlohy vykonává v rodiči, nebo v potomku. Volání fork() má jako návratovou hodnotu PID procesu (potomka), který právě vytvořilo. Pokud se programu z nějakého důvodu nepovede rozvětvení, vrátí jako PID potomka -1. Když si tuto hodnotu zapamatujeme, můžeme podle ní pak zjistit, zda kód vykonává rodič, nebo potomek.

Protože rodič má v proměnné child_pid uložený PID svého potomka, lze podle toho rozhodnout, zda se program vykonává v rodiči/potomkovi. Vzhledem k tomu, že při rozvrhování procesů není zaručeno pořadí, v jakém se vykonávají (ve skutečnosti se každý vykonává chvíli) je zde možnost více pořadí ve výstupu programu. Program by ale měl například vypsat:

 

Mohlo by se vám líbit...

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *