exec (wywołanie systemowe) - exec (system call)

W informatyce , exec to funkcja systemu operacyjnego, która uruchamia plik wykonywalny w kontekście już istniejącego procesu , zastępując poprzedni plik wykonywalny. Ten akt jest również nazywany nakładką . Jest to szczególnie ważne w systemach uniksopodobnych, chociaż istnieje gdzie indziej. Ponieważ nie jest tworzony żaden nowy proces, identyfikator procesu (PID) nie zmienia się, ale kod maszynowy , dane , sterta i stos procesu są zastępowane tymi z nowego programu.

Exec połączenie jest dostępne dla wielu języków programowania , w tym compilable języków i niektórych języków skryptowych . W ustnych komend OS The Exec wbudowane polecenie zastępuje proces powłoki z określonym programem.

Nomenklatura

Interfejsy do exec i jego implementacje różnią. W zależności od języka programowania może być dostępny za pośrednictwem jednej lub więcej funkcji , aw zależności od systemu operacyjnego może być reprezentowany przez jedno lub więcej rzeczywistych wywołań systemowych . Z tego powodu exec jest czasami opisywany jako zbiór funkcji .

Standardowe nazwy takich funkcji w C execl , execle , execlp , execv , execve i execvp (patrz poniżej ), ale nie "exec" sama. Jądro Linux ma jeden odpowiadający wywołania systemowego o nazwie „exec”, podczas gdy wszystkie wyżej wymienione funkcje są owijarki przestrzeni użytkownika wokół niego.

Języki wyższego poziomu zwykle zapewniają jedno wywołanie o nazwie exec .

Unix, POSIX i inne systemy wielozadaniowe

Prototypy w języku C.

POSIX standardowy deklaruje exec funkcji w unistd.h nagłówka pliku w języku C . Te same funkcje są zadeklarowane w process.h dla DOS (patrz poniżej ), OS / 2 i Microsoft Windows.

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

Niektóre implementacje zapewniają funkcje nazwane z początkowym podkreśleniem (np. _Execl).

Podstawą każdego z nich jest exec (execute), po której następuje jedna lub więcej liter:

e - Tablica wskaźników do zmiennych środowiskowych jest jawnie przekazywana do nowego obrazu procesu.
l - argumenty linii poleceń są przekazywane indywidualnie (a L IST) do funkcji.
p - używa zmiennej środowiskowej PATH, aby znaleźć plik o nazwie w argumencie plik do wykonania.
v - argumenty wiersza polecenia są przekazywane do funkcji jako tablicę ( v ector) o wskazówki.
ścieżka

Argument określa nazwę ścieżki pliku do wykonania jako nowy obraz procesu. Argumenty zaczynające się od arg0 wskaźnikami do argumentów, które mają być przekazane do nowego obrazu procesu. Wartość argv to tablica wskaźników do argumentów.

arg0

Pierwszym argumentem arg0 powinna być nazwa pliku wykonywalnego. Zwykle jest to ta sama wartość, co argument ścieżki . Niektóre programy mogą niepoprawnie polegać na tym argumencie, podając lokalizację pliku wykonywalnego, ale nie ma na to gwarancji ani nie jest on ustandaryzowany na różnych platformach.

envp

Argument envp to tablica wskaźników do ustawień środowiska. W Exec połączenia o nazwie zakończonej e zmieniać środowisko dla nowego procesu przekazując listę ustawień środowiska poprzez envp argument. Ten argument jest tablicą wskaźników do znaków; każdy element (z wyjątkiem elementu końcowego) wskazuje na łańcuch zakończony znakiem null definiujący zmienną środowiskową .

Każdy ciąg zakończony znakiem null ma postać:

name=value

gdzie nazwa to nazwa zmiennej środowiskowej, a wartość to wartość tej zmiennej. Ostatni element tablicy envp musi mieć wartość null .

W execl , execlp , execv i execvp połączeń, nowy proces obraz dziedziczy bieżące zmienne środowiskowe.

Efekty

Deskryptor otwarty gdy Exec nawiązane połączenie pozostaje otwarty w nowego procesu, o ile nie był fcntl wyd z FD_CLOEXEC lub otwierane O_CLOEXEC (ten ostatni wprowadzono POSIX.1-2001). Ten aspekt służy do określenia standardowych strumieni (stdin, stdout i stderr) nowego programu.

Pomyślna nakładka niszczy poprzednią przestrzeń adresową pamięci procesu, a wszystkie jej obszary pamięci, które nie zostały udostępnione , są odzyskiwane przez system operacyjny. W rezultacie wszystkie jego dane, które nie zostały przesłane do nowego programu lub zapisane w inny sposób, zostaną utracone.

Wartość zwracana

Udana exec zastępuje aktualny obraz procesu, więc nie mogę nic powrócić do programu, który sprawdził. Procesy mają status wyjścia , ale ta wartość jest zbierana przez proces nadrzędny .

Jeśli funkcja exec powraca do programu wywołującego, pojawia się błąd, zwracana wartość to −1, a errno jest ustawiane na jedną z następujących wartości:

Nazwa Uwagi
E2BIG Lista argumentów przekracza limit systemowy.
EACCES Określony plik narusza zasady dotyczące blokowania lub udostępniania.
ENOENT Nie znaleziono nazwy pliku lub ścieżki.
ENOMEM Za mało pamięci do wykonania nowego obrazu procesu.

Systemy operacyjne DOS

DOS nie jest wielozadaniowym systemem operacyjnym, ale zastąpienie poprzedniego obrazu wykonywalnego ma tam wielką zaletę ze względu na surowe ograniczenia pamięci podstawowej i brak pamięci wirtualnej . To samo API jest używane do nakładania programów w DOS i ma efekty podobne do tych w systemach POSIX.

Funkcje exec w systemie MS-DOS zawsze ładują nowy program do pamięci, tak jakby „maksymalna alokacja” w nagłówku pliku wykonywalnego programu była ustawiona na wartość domyślną 0xFFFF. Narzędzie EXEHDR może służyć do zmiany maksymalnego pola alokacji programu. Jeśli jednak zostanie to zrobione, a program zostanie wywołany z jedną z funkcji exec , program może zachowywać się inaczej niż program wywołany bezpośrednio z wiersza poleceń systemu operacyjnego lub z jedną z funkcji spawn (patrz poniżej ).

Tłumacze poleceń

Wiele powłok systemu Unix oferuje również wbudowane polecenie exec, które zastępuje proces powłoki określonym programem. Skrypty opakowujące często używają tego polecenia do uruchamiania programu (bezpośrednio lub przez interpreter lub maszynę wirtualną ) po ustawieniu zmiennych środowiskowych lub innej konfiguracji. Używając exec , zasoby używane przez program powłoki nie muszą pozostać w użyciu po uruchomieniu programu.

Polecenie exec może również wykonać przekierowanie . W niektórych powłokach możliwe jest nawet użycie polecenia exec tylko do przekierowania, bez wykonywania faktycznej nakładki.

Alternatywy

Tradycyjny system Unix nie ma funkcji tworzenia nowego procesu, który uruchamia nowy program wykonywalny w jednym kroku, co wyjaśnia znaczenie exec dla programowania w systemie Unix. Inne systemy mogą używać spawn jako głównego narzędzia do uruchamiania plików wykonywalnych. Jego wynik jest równoważny sekwencji fork-exec systemów uniksopodobnych. POSIX obsługuje procedury posix_spawn jako opcjonalne rozszerzenie, które zwykle jest implementowane przy użyciu vfork .

Inne systemy

OS / 360 i jego następcy zawierają wywołanie systemowe XCTL (sterowanie transferem), które wykonuje podobną funkcję co exec.

Zobacz też

Bibliografia

  1. ^ a b "exec (3) - strona podręcznika Linux" . man7.org . Źródło 2016-10-14 .
  2. ^ „Opakowania powłoki” . Projekt dokumentacji systemu Linux . 2014-03-10 . Źródło 2021-02-18 .

Zewnętrzne linki