exec (Unix)

exec*()je skupina systémových volání pod Unixem a unixovými operačními systémy . Všichni mají společné to, že zahájí nový proces v prostředí stávajícího procesu a tím ho nahradí. (Tento proces se také nazývá překrytí .) Ve standardu POSIX jsou v záhlaví souboruunistd.h definovány následující prototypy funkcí :

 int execl(char const *path, char const *arg0, ...);
 int execle(char const *path, char const *arg0, ..., char const *envp[]);
 int execlp(char const *file, char const *arg0, ...);
 int execv(char const *path, char const *argv[]);
 int execve(char const *path, char const *argv[], char const *envp[]);
 int execvp(char const *file, char const *argv[]);

Znamenat:

arg0
první (ve skutečnosti: nula, protože je implicitně nastaven) argument na příkazovém řádku a konvenčně název prováděného spustitelného souboru. Špatně naprogramovaný software se může spolehnout na tyto informace, aby určil přesné umístění v systému souborů, ze kterého byl spuštěn spuštěný program. To však není nejen zaručeno standardem, ale také není důsledně regulováno napříč platformami.
envp []
pole ukazatelů, které ukazují na řetězce proměnné formuláře = hodnota a představují prostředí procesu
cesta
název cesty k souboru, který má být spuštěn. (Toto by mělo být použito pro tuto informaci namísto arg0 .)
argv []
pole ukazatelů, které odkazují na předané argumenty příkazového řádku.

Jsou zahrnuta obě pole envp[]a argv[]obsahují ukazatele na řetězce s nulovým zakončením. Posledním prvkem pole je obvykle nulový ukazatel, který označuje konec pole.

Vedlejší efekty

Otevřené deskriptory souborů procesu volání také zůstanou otevřené v novém procesu. Prostředí je také v zásadě zachováno. Naproti tomu (soukromá) data a kód volajícího procesu jsou překrytím zničeny a nahrazeny daty a kódem překrytí. Na rozdíl od výhradně použité paměti není sdílená paměť ovlivněna.

Návratový kód úspěšně provedeného exec*()volání nelze volajícím procesem dotazovat, protože byl nahrazen voláním. Nahrazení procesu voláním exec * () nekončí proces, který nadále existuje (pouze ve změněném stavu). V případě neúspěšného volání (v tomto případě stále probíhá proces, který má být nahrazen) se vrátí −1 a nastaví se errnona jednu z následujících hodnot (viz errno.h):

E2BIG Seznam argumentů je větší, než povoluje příslušný systémový limit.
EACCES Přístup k spustitelnému souboru byl odepřen. (Možné důvody mohou být: soubor uzamčen, chybějící práva, ...)
ENOENT Spustitelný soubor nebyl nalezen.
ENOMEM Pro spuštění programu není k dispozici dostatek paměti.

Historie, současné použití

Původní Unix nemohl v jednom kroku zahájit nový, odlišný proces od stávajícího . Místo toho byla kopie existujícího procesu vytvořena pomocí fork () a poté byla jedna z exec*()funkcí použita k poskytnutí vytvořené kopie s (jiným) překrytím. Tato skupina systémových volání proto měla velký význam.

Mezitím, POSIX definuje skupinu systémových volání posix_spawn*()jakožto (volitelné) prodloužení, se kterou je sekvence fork()- lze exec*()se vyhnout, ale se ztrátou části flexibility, že tento mechanismus nabízí.

exec jako příkaz prostředí

Mnoho běžných skořápek Unix také implementuje příkaz, execkterý v podstatě dělá totéž jako systémové volání: spuštěný proces (nebo spuštěný skript) je nahrazen instancí zadaného nového spustitelného souboru. V uvedeném příkladu se tento mechanismus používá k ukončení spouštěcího skriptu X11 po volání správce oken:

 #!/bin/ksh
 xclock &
 xsetroot -solid black
 exec mwm -multiscreen -xrm "ShowFeedback: -quit"

webové odkazy