EXEC(3)

NAZWA
execl, execlp, execle, execv, execvp - uruchomienie pliku

SKŁADNIA
#include <unistd.h>

extern char **environ;

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

OPIS
Rodzina funkcji exec zastępuje w pamięci obraz aktualnego procesu obrazem nowego procesu. Funkcje opisane na tej stronie man są tylko nakładkami dla funkcji execve(2). (Dodatkowych informacji na temat nadpisywania aktualnego procesu szukaj na stronie man tej funkcji.)

Pierwszym argumentem tych funkcji jest ścieżka do pliku, który ma być uruchomiony.

Kolejne wyrażenia const char *arg w funkcjach execl, execlp, i execle można traktować jako arg0, arg1, ..., argn. Razem opisują one listę jednego lub więcej wskaźników do zakończonych znakiem NUL łańcuchów, reprezentujących listę argumentów udostępnoianych wykonywanemu programowi. Pierwszy argument, zgodnie z konwencją, powinien wskazywać na nazwę pliku powiązaną z wykonywanym plikiem. Lista argumentów musi być zakończona wskaźnikiem NULL.

Funkcje execv oraz execvp udostępniają tablicę wskaźników do zakończonych znakami NUL łańcuchów, które reprezentują listę argumentów dostępnych dla wykonywanego programu. Pierwszy argument, zgodnie z konwencją, powinien wskazywać na nazwę pliku powiązaną z wykonywanym plikiem. Tablica wskaźników musi być zakończona wskaźnikiem NULL.

Funkcja execle dodatkowo określa środowisko wykonywanego procesu poprzez dodanie po wskaźniku NULL, kończącym listę argumentów w liście parametrów lub po tablicy argv dodatkowego argumentu. Tym dodatkowym argumentem jest tablica wskaźników do zakończonych znakami NUL łańcuchów, która to tablica musi być zakończona wskaźnikiem NULL. Pozostałe funkcje pobierają środowisko dla nowego procesu z zewnętrznej zmiennej environ aktualnego procesu.

Niektóre z tych funkcji mają specyficzną semantykę.

Funkcje execlp oraz execvp wykonują zadania powłoki szukając pliku wykonywalnego, jeśli nazwa pliku nie zawiera znaku ukośnika (/). Ścieżka przeszukiwania to ścieżka podana w zmiennej środowiskowej PATH. Jeśli zmienna ta nie istnieje, przyjmowana jest domyślna ścieżka ``:/bin:/usr/bin''. Dodatkowo pewne błędy traktowane są odmiennie.

Jeśli dostęp do pliku został zabroniony (wywołanie execve zwróciło EACCES), funkcje te będą przeszukiwać resztę ścieżki. Jeśli jednak nie odnajdą innego pliku, powrócą i zmienią wartość zmiennej globalnej errno na EACCES.

Jeśli nagłówek nie zostanie rozpoznany (wywołanie execve zwróci ENOEXEC), funkcje te spróbują uruchomić powłokę ze ścieżką do pliku jako pierwszym argumentem. (Jeśli i ta próba się nie powiedzie, przeszukiwanie jest zakończone.)

WARTOŚĆ ZWRACANA
Jeśli dowolna z funkcji exec powróci, oznacza to że nastąpił błąd. Zwracana jest wartość -1 i ustawiana jest zmienna globalna errno aby wskazać błąd.

PLIKI
/bin/sh

BŁĘDY
Każda z tych funkcji może zakończyć się niepowodzeniem i ustawić jako wartość errno dowolny błąd określony dla funkcji bibliotecznej execve(2).

ZOBACZ TAKŻE
sh(1), execve(2), fork(2), environ(5), ptrace(2)

KOMPATYBILNOŚĆ
W niektórych systemach domyślna ścieżka (używana, gdy środowisko nie zawiera zmiennej PATH) zawiera aktualny katalog na samym końcu listy, po /bin oraz /usr/bin, aby zapobiec koniom trojańskim. Linux korzysta tu z tradycyjnej domyślnej ścieżki z aktualnym katalogiem na początku.

Zachowanie execlp oraz execvp w przypadku wystąpienia błędów podczas uruchamiania pliku jest przyjęte jako tradycyjne, ale nie jest udokumentowane przez standard POSIX. BSD (a być może także inne systemy) po napotkaniu błędu ETXTBSY czeka przez chwilę i próbuje ponownie. Linux traktuje to jako błąd i powraca natychmiast.

Tradycyjnie, funkcje execlp oraz execvp ignorowały wszystkie błędy oprócz podanych powyżej, ENOMEM i E2BIG, po których powracały. Obecnie powracają jeśli wystąpi dowolny błąd inny od opisanych powyżej.

ZGODNE Z
Funkcje execl, execv, execle, execlp oraz execvp są zgodne ze standardem IEEE Std1003.1-88 (`POSIX.1'').