Provided by:
manpages-pl-dev_20051117-1_all 
NAZWA
execve - uruchomienie programu
SKŁADNIA
#include <unistd.h>
int execve(const char *filename, char *const argv [], char *const
envp[]);
OPIS
execve() uruchamia program wskazany przez filename. filename musi być
albo wykonywalnym programem binarnym, albo skryptem powłoki,
rozpoczynającym się od linii postaci "#! interpreter [arg]". W tym
drugim przypadku, interpreter musi być prawidłową ścieżką do programu,
a nie skryptem, który byłby uruchomiany jako interpreter [arg]
filename.
argv jest tablicą łańcuchów przekazywanych jako argumenty nowego
programu. envp jest tablicą łańcuchów postaci klucz=wartość, która jest
przekazywana jako środowisko do nowego programu. Zarówno argv, jak i
envp muszą być zakończone wskaźnikiem pustym (NULL). Tablica
argumentów oraz środowisko są dostępne w funkcji main wywoływanego
programu, jeżeli jest ona zdefiniowana jako int main(int argc, char
*argv[], char *envp[]).
execve() nie powraca po pomyślnym wywołaniu, a segmenty text, data, bss
oraz segment stosu procesu wywołującego zostają nadpisane przez
odpowiedniki ładowanego programu. Wywoływany program dziedziczy PID
procesu wywołującego i wszelkie deskryptory otwartych plików, które nie
są ustawione jako "close on exec". Sygnały oczekujące na proces
wywołujący zostają wyczyszczone. Sygnałom, które były przechwytywane
przez proces wywołujący, zostaje przypisana ich domyślna obsługa.
Sygnał SIHCHLD (jeżeli jest ustawiony na SIG_IGN) może, ale nie musi
być przestawiony na SIG_DFL.
Jeśli obecny program jest ptrace'owany, wysyła się mu SIGTRAP po
pomyślnym execve().
Jeżeli plik programu wskazywany przez filename ma ustawiony bit set-
uid, to efektywny identyfikator użytkownika procesu wywołującego jest
ustawiany na właściciela pliku programu. Podobnie, jeżeli dla pliku
programu ustawiony jest bit set-gid, to efektywnemu identyfikatorowi
grupy procesu wywołującego jest przypisywana grupa pliku programu.
Jeśli program wykonywalny jest skonsolidowany dynamicznie w formacie
a.out z bibliotekami dzielonymi, na początku uruchamieina wywoływany
jest konsolidator dynamiczny ld.so(8), który ładuje wszystkie
biblioteki do rdzenia i konsoliduje z nimi program wykonywalny.
Jeżeli program jest skonsolidowany dynamicznie jako ELF, to do
załadowania potrzebnych bibliotek współdzielonych używany jest
interpreter określony w segmencie PT_INTERP. Tym interpreterem jest
zazwyczaj /lib/ld-linux.so.1, w wypadku programów skonsolidowanych z
biblioteką libc w wersji 5, albo /lib/ld-linux.so.2 - dla programów
skonsolidowanych z biblioteką GNU libc w wersji 2.
WARTOŚĆ ZWRACANA
Po pomyślnym zakończeniu execve() nie wraca, w wypadku błędu zwracane
jest -1 i odpowiednio ustawiane errno .
BŁĘDY
EACCES Plik lub interpreter skryptu nie jest zwykłym plikiem.
EACCES Brak praw wykonywania dla pliku, skryptu lub intepretera ELF.
EACCES System plików jest zamontowany jako noexec.
EPERM System plików jest zamontowany jako nosuid, użytkownik nie jest
superużytkownikiem, a plik ma ustawiony bit SUID lub SGID.
EPERM Proces jest śledzony (trace), użytkownik nie jest
superużytkownikiem, a plik ma ustawiony bit SUID lub SGID.
E2BIG Lista argumentów jest zbyt długa.
ENOEXEC
Nie rozpoznano formatu pliku binarnego, plik ten jest
skompilowany dla innej architektury albo wystąpił jakiś inny
błąd w formacie, który powoduje, że program nie może być
uruchomiony.
EFAULT filename wskazuje poza dostępną dla użytkownika przestrzeń
adresową.
ENAMETOOLONG
filename jest zbyt długie.
ENOENT Plik filename, skrypt, lub intepreter ELF nie istnieje albo nie
można znaleźć biblioteki współdzielonej potrzebnej do
uruchomienia pliku lub interpretera.
ENOMEM Brak dostępnej pamięci jądra.
ENOTDIR
Składnik ścieżki filename, ścieżki skryptu lub ścieżki
interpretera ELF nie jest katalogiem.
EACCES Brak praw do przeszukiwania dla składnika ścieżki filename lub
ścieżki interpretera skryptu.
ELOOP Podczas rozwiązywania filename, nazwy skryptu lub interpretera
ELF napotkano zbyt wiele dowiązań symbolicznych.
ETXTBSY
Plik wykonywalny był otwarty do zapisu przez jeden lub więcej
procesów.
EIO Wystąpił błąd wejścia-wyjścia.
ENFILE Został osiągnięte ograniczenie liczby otwartych plików w
systemie.
EMFILE Proces osiągnął już maksymalną liczbę otwartych plików.
EINVAL Plik wykonywalny w formacie ELF ma więcej niż jeden segment
PT_INTERP (tzn. ma więcej niż jeden interpreter).
EISDIR Intepreter ELF jest katalogiem.
ELIBBAD
Nie został rozpoznany format intepretera ELF.
ZGODNE Z
SVr4, SVID, X/OPEN, BSD 4.3. POSIX nie dokumentuje zachowania #!, lecz
poza tym jest zgodny. SVr4 dokumentuje dodatkowe błędy EAGAIN, EINTR,
ELIBACC, ENOLINK, EMULTIHOP; POSIX nie dokumentuje błędów ETXTBSY,
EPERM, EFAULT, ELOOP, EIO, ENFILE, EMFILE, EINVAL, EISDIR i ELIBBAD.
UWAGI
Procesy ustawiające SUID lub SGID nie mogą być traktowane ptrace().
Linux ignoruje bity SUID i SGID dla skryptów.
Efect zamontowania systemu plików nosuid jest różny dla różnych wersji
jądra Linuksa: niektóre odmówią uruchomienia programów SUID/SGID, gdy
spowodowałoby to udostępnienie użytkownikowi możliwości, którymi w
danym momencie nie dysponuje (i zwrócą EPERM), inne po prostu zignorują
bity SUID/SGID i wykonają exec pomyślnie.
Maksymalna długość pierwszej linii skryptu powłoki, zawierającej #!
wynosi 127 znaków.
ZOBACZ TAKŻE
chmod(2), fork(2), execl(3), environ(5), ld.so(8)