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
- Popis otevřené skupiny z roku 2016