exec (Unix)

exec*()Jest to grupa wywołań systemowych pod Unix i uniksopodobnych systemów operacyjnych . To, co je łączy, to rozpoczęcie nowego procesu w środowisku już istniejącego i tym samym zastąpienie go. (Ten proces jest również nazywany nakładaniem ). W standardzie POSIX w pliku nagłówkowym unistd.h zdefiniowane następujące prototypy funkcji :

 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[]);

Oznaczać:

arg0
pierwszy (właściwie: zerowy, ponieważ jest niejawnie ustawiony) argument w linii poleceń i umownie nazwa wykonywanego pliku wykonywalnego. Źle zaprogramowane oprogramowanie może opierać się na tych informacjach w celu określenia dokładnej lokalizacji w systemie plików, z którego został załadowany uruchomiony program. Jednak nie tylko nie gwarantuje tego standard, ale także nie jest konsekwentnie regulowany na różnych platformach.
envp []
tablica wskaźników wskazujących na ciągi znaków w postaci zmienna = wartość i reprezentujących środowisko procesu
ścieżka
nazwa ścieżki do pliku do uruchomienia. (Powinno to być używane dla tej informacji zamiast arg0 ).
argv []
tablica wskaźników wskazujących na przekazane argumenty wiersza poleceń.

Obie tablice są zaangażowane envp[]i argv[]zawierają wskaźniki do ciągów zakończonych zerem. Ostatnim elementem tablicy jest zwykle wskaźnik zerowy, który wskazuje koniec tablicy.

Skutki uboczne

Otwarte deskryptory plików procesu wywołującego również pozostają otwarte w nowym procesie. Środowisko jest w zasadzie zachowane. Natomiast (prywatne) dane i kod procesu wywołującego są niszczone przez nakładkę i zastępowane danymi i kodem nakładki. W przeciwieństwie do pamięci używanej wyłącznie na pamięć współdzieloną nie ma to wpływu.

Proces exec*()wywołujący nie może zapytać o kod powrotu pomyślnie wykonanego wywołania, ponieważ został on zastąpiony przez wywołanie. Zastąpienie procesu wywołaniem exec * () nie kończy procesu, który nadal istnieje (tylko w zmienionym stanie). W przypadku nieudanego wywołania (w tym przypadku zastępowany proces nadal działa) zwracane jest −1 i ustawiane errnona jedną z następujących wartości (zobacz errno.h):

E2BIG Lista argumentów jest większa niż pozwala na to odpowiedni limit systemu.
EACCES Odmówiono dostępu do pliku wykonywalnego. (Możliwe przyczyny to: plik zablokowany, brakujące prawa, ...)
ENOENT Nie znaleziono pliku wykonywalnego do uruchomienia.
ENOMEM Za mało dostępnej pamięci, aby uruchomić program.

Historia, aktualne wykorzystanie

Oryginalny Unix nie mógł w jednym kroku rozpocząć nowego, innego procesu od istniejącego . Zamiast tego została utworzona kopia istniejącego procesu za pomocą fork (), a następnie jedna z exec*()funkcji została użyta do nadania utworzonej kopii (innej) nakładki. Dlatego ta grupa wywołań systemowych miała ogromne znaczenie.

W międzyczasie POSIX zdefiniował grupę wywołań systemowych posix_spawn*()jako (opcjonalne) rozszerzenie, za pomocą którego fork()można exec*()uniknąć sekwencji - , ale z utratą części elastyczności oferowanej przez ten mechanizm.

exec jako polecenie powłoki

Wiele powszechnych powłok systemu Unix również implementuje polecenie, execktóre zasadniczo robi to samo, co wywołanie systemowe: działający proces (lub uruchomiony skrypt) jest zastępowany instancją określonego nowego pliku wykonywalnego. W podanym przykładzie ten mechanizm jest używany do wyjścia ze skryptu startowego X11 po wywołaniu menedżera okien:

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

linki internetowe