exec(3) Library Functions Manual exec(3) NAZWA execl, execlp, execle, execv, execvp, execvpe - uruchamia plik BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include extern char **environ; int execl(const char *path, const char *arg, ... /*, (char *) NULL */); int execlp(const char *file, const char *arg, ... /*, (char *) NULL */); int execle(const char *path, const char *arg, ... /*, (char *) NULL, char *const envp[] */); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execvpe(const char *file, char *const argv[], char *const envp[]); Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)): execvpe(): _GNU_SOURCE OPIS Rodzina funkcji exec() zastepuje w pamieci obraz biezacego procesu obrazem nowego procesu. Funkcje opisane na tej stronie podrecznika sa tylko nakladkami dla funkcji execve(2). (Dodatkowe informacje na temat nadpisywania biezacego procesu mozna znalezc na stronie podrecznika execve(2)). Pierwszym argumentem tych funkcji jest sciezka do pliku, ktory ma byc uruchomiony. Funkcje moga byc pogrupowane na podstawie liter, ktore nastepuja po przedrostku ,,exec". l - execl(), execlp(), execle() Kolejne wyrazenia const char *arg mozna traktowac jako arg0, arg1, ..., argn. Razem opisuja one liste jednego lub wiecej wskaznikow do zakonczonych znakiem NUL lancuchow, reprezentujacych liste argumentow udostepnianych wykonywanemu programowi. Pierwszy argument, zgodnie z konwencja, powinien wskazywac na nazwe pliku powiazana z wykonywanym plikiem. Lista argumentow musi byc zakonczona wskaznikiem null, a poniewaz te funkcje sa funkcjami o zmiennej liczbie argumentow, wskaznik ten musi byc rzutowany na (char *) NULL. W odroznienie od funkcji zawierajacych w nazwie ,,l", ponizsze funkcje z ,,v" okreslaja argumenty wiersza polecen wykonywanego programu, jako wektor. v - execv(), execvp(), execvpe() Argument char *const argv[] jest tablica wskaznikow do zakonczonych znakami NUL lancuchow reprezentujacych liste argumentow dostepnych dla wykonywanego programu. Pierwszy argument, zgodnie z konwencja, powinien wskazywac na nazwe pliku powiazana z wykonywanym plikiem. Tablica wskaznikow musi byc zakonczona wskaznikiem null. e - execle(), execvpe() Srodowisko nowego obrazu procesu podaje sie za pomoca argumentu envp. Argument envp jest tablica wskaznikow do zakonczonych znakiem NUL lancuchow znakow i musi byc zakonczony wskaznikiem null. Wszystkie pozostale funkcje exec() (ktore nie zawieraja w przyrostku ,,e"), pobieraja srodowisko dla obrazu nowego procesu z zewnetrznej zmiennej environ procesu wywolujacego. p - execlp(), execvp(), execvpe() Funkcje te wykonuja zadania powloki, szukajac pliku wykonywalnego, jesli nazwa pliku nie zawiera znaku ukosnika (/). Plik jest wyszukiwany w rozdzielonej dwukropkami liscie sciezek do katalogow podanej w zmiennej srodowiskowej PATH. Jesli ta zmienna nie jest zdefiniowana, lista sciezek korzysta z listy domyslnej, ktora zawiera katalogi zwracane przez confstr(_CS_PATH) (zwykle zwraca wartosc ,,/bin:/usr/bin") i byc moze rowniez biezacy katalog roboczy; wiecej szczegolow w WERSJACH. execvpe() szuka programu za pomoca wartosci zmiennej PATH ze srodowiska wywolujacego, a nie z argumentu envp. Jesli podana nazwa pliku zawiera znak ukosnika, to wartosc zmiennej PATH jest ignorowana i wykonywany jest plik z podanej lokalizacji. Dodatkowo pewne bledy sa traktowane w specjalny sposob. Jesli dostep do pliku zostal zabroniony (wywolanie execve(2) zakonczylo sie bledem EACCES), funkcje te beda przeszukiwac reszte sciezki. Jesli jednak nie odnajda innego pliku, powroca i ustawia wartosc zmiennej errno na EACCES. Jesli naglowek nie zostanie rozpoznany (wywolanie execve(2) zakonczy sie bledem ENOEXEC), funkcje te sprobuja uruchomic powloke (/bin/sh) ze sciezka do pliku jako pierwszym argumentem. (Jesli i ta proba sie nie powiedzie, przeszukiwanie zostanie zakonczone). Wszelkie inne funkcje exec() (ktore nie zawieraja ,,p" w przyrostku) przyjmuja jako swoj pierwszy argument sciezke (wzgledna lub absolutna), ktora identyfikuje program do wykonania. WARTOSC ZWRACANA Funkcje exec() powracaja tylko wtedy, gdy wystapi blad. Zwracana jest wartosc -1 i ustawiana jest zmienna errno, okreslajaca rodzaj bledu. BLEDY Kazda z tych funkcji moze zakonczyc sie niepowodzeniem i ustawic jako wartosc errno dowolny blad okreslony dla execve(2). ATRYBUTY Informacje o pojeciach uzywanych w tym rozdziale mozna znalezc w podreczniku attributes(7). +-----------------------+--------------------------+-------------------+ |Interfejs | Atrybut | Wartosc | +-----------------------+--------------------------+-------------------+ |execl(), execle(), | Bezpieczenstwo watkowe | MT-bezpieczne | |execv() | | | +-----------------------+--------------------------+-------------------+ |execlp(), execvp(), | Bezpieczenstwo watkowe | MT-bezpieczne env | |execvpe() | | | +-----------------------+--------------------------+-------------------+ WERSJE Domyslna sciezka przeszukiwana (uzywana, gdy srodowisko nie zawiera zmiennej PATH) ukazuje pewne roznice miedzy systemami. Zwykle zawiera /bin i /usr/bin (w tej kolejnosci), moze tez zawierac biezacy katalog roboczy. W niektorych innych systemach, biezacy katalog roboczy wystepuje po /bin i /usr/bin, co ma utrudnic ataki trojanow. Implementacja glibc przez dlugi czas dzialala zgodnie z tradycyjnymi wartosciami domyslnymi, gdy biezacy katalog roboczy jest umieszczony na poczatku sciezki przeszukiwania. Jednak pewien refaktoring kodu, jaki mial miejsce podczas rozwoju glibc 2.24 spowodowal zupelne porzucenie biezacego katalogu roboczego z domyslnej sciezki przeszukiwania. Ta przypadkowa zmiana zachowania jest uwazana za dosc pozytywna i nie zostanie odwrocona. Zachowanie execlp() oraz execvp() w przypadku wystapienia bledow podczas uruchamiania pliku jest przyjete jako tradycyjne, ale nie jest udokumentowane przez standard POSIX. BSD (a byc moze takze inne systemy) po napotkaniu bledu ETXTBSY czeka przez chwile i probuje ponownie. Linux traktuje to jako blad i powraca natychmiast. Tradycyjnie funkcje execlp() oraz execvp() ignorowaly wszystkie bledy oprocz podanych powyzej oraz ENOMEM i E2BIG, po ktorych powracaly. Obecnie powracaja takze wtedy, gdy wystapi dowolny blad inny od opisanych powyzej. STANDARDY environ execl() execlp() execle() execv() execvp() POSIX.1-2008. execvpe() GNU. HISTORIA environ execl() execlp() execle() execv() execvp() POSIX.1-2001. execvpe() glibc 2.11. USTERKI Przed glibc 2.24, execl() i execle() korzystaly wewnetrznie z realloc(3) dlatego nie byly async-signal-safe, co stanowilo naruszenie wymagan POSIX.1. Poprawiono to w glibc 2.24. Szczegoly typowe dla architektury Na architekturach sparc i sparc64, execv() jest udostepnione jako wywolanie systemowe przez jadro (z prototypem ukazanym powyzej) ze wzgledu na kompatybilnosc z SunOS. Ta funkcja nie jest wykorzystywana przez przez funkcje opakowujaca execv() na tych architekturach. ZOBACZ TAKZE sh(1), execve(2), execveat(2), fork(2), ptrace(2), fexecve(3), system(3), environ(7) TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: Adam Byrtek , Andrzej Krzysztofowicz , Robert Luberda i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.17 17 maja 2025 r. exec(3)