BEZEICHNUNG¶
execl, execlp, execle, execv, execvp, execvpe - führt eine Datei aus
ÜBERSICHT¶
#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[]);
int execvpe(const char *file, char *const
argv[],
char *const envp[]);
Mit Glibc erforderliche Makros (siehe
feature_test_macros(7)):
execvpe(): _GNU_SOURCE
BESCHREIBUNG¶
Die
exec()-Funktionsfamilie ersetzt den aktuellen Programmcode im
Speicher mit einem neuen Prozessabbild. Die in dieser Handbuchseite
beschriebenen Bibliotheksfunktionen sind Frontends zu der Systemfunktion
execve(2). (Siehe die Handbuchseite von
execve(2) für
weitere Details über das Ersetzen des aktuellen Prozessabbilds.)
Das erste Argument dieser Funktionen ist der Name der Datei, die ausgeführt
werden soll.
Der Ausdruck
const char *arg und die nachfolgenden Auslassungspunkte
(»...«) der Funktionen
execl(),
execlp() und
execle() sind als eine Liste mit einer unbestimmten Anzahl von
Parametern
arg0,
arg1, ...,
argn zu verstehen. Zusammen
stellen sie eine Liste mit einem oder mehreren Zeigern auf nullterminierte
(mit '\0' abgeschlossenen) Zeichenketten dar, die dem aufgerufenen Programm
als Argumentliste verfügbar ist. Der erste Eintrag sollte
konventionsgemäß ein Zeiger auf den Dateinamen des aufgerufenen
Programms sein. Die Parameterliste
muss mit einem NULL-Zeiger
abgeschlossen werden und weil es variadische Funktionen sind, muss für
diesen Zeiger eine Typumwandlung (cast) zu
(char *) NULL
durchgeführt werden.
Die Funktionen
execv(),
execvp() und
execvpe()
übergeben die Aufrufparameter an das Folgeprogramm in einem Feld von
Zeigern auf nullterminierte Zeichenketten. Das erste Argument sollte
konventionsgemäß auf den Namen der auszuführenden Datei weisen.
Der Feld von Zeigern
muss mit einem NULL-Zeiger als letztem Eintrag
abgeschlossen werden.
Die Funktionen
execle() und
execvpe() ermöglichen dem
aufrufenden Programm, die Umgebung für das auszuführende Programm
mittels des Arguments
envp zu übergeben. Das Argument
envp
ist ein Feld von Zeigern auf nullterminierte Zeichenketten und
muss mit
einem NULL-Zeiger als letztem Eintrag abgeschlossen werden. Die übrigen
Funktionen übernehmen die Umgebungsvariablen für den neuen Prozess
von der externen Variablen
environ im aufrufenden Prozess.
Spezielle Semantik für execlp() und execvp()¶
Die Funktionen
execlp(),
execvp() und
execvpe() suchen
ebenso wie die Shell nach einem ausführbaren Programm, wenn der
angegebene Dateiname keinen Schrägstrich (/) enthält. Die Datei wird
in der durch Doppelpunkte getrennten Liste von Verzeichnis-Pfadnamen in der
Umgebungsvariablen
PATH gesucht. Wenn diese Variable nicht definiert
ist, ist die Pfadliste standardmäßig das aktuelle Verzeichnis,
gefolgt von der Verzeichnisliste, die von
confstr(_CS_PATH)
zurückgegeben wird. (Dieser Aufruf von
confstr(3) gibt in der
Regel den Wert »/bin:/usr/bin« zurück.).
Falls der angegebene Dateiname einen Schrägstrich enthält, wird
PATH ignoriert und die Datei mit dem angegebenen Pfadnamen
ausgeführt.
Zusätzlich werden bestimmte Fehler speziell behandelt.
Falls die Ausführung einer gefundenen Datei verweigert wird (die versuchte
Ausführung von
execve(2) führte zum Fehler
EACCES),
werden diese Funktionen im restlichen Suchpfad weitersuchen. Wenn aber keine
andere Datei gefunden wird, kehren diese Funktionen zurück und setzen
errno auf
EACCES.
Wenn der Header einer Datei nicht erkannt wird (die versuchte Ausführung
von
execve(2) führte zum Fehler
ENOEXEC), starten diese
Funktionen die Shell (
/bin/sh) mit dem Pfadnamen der Datei als erstes
Argument. (Wenn dieser Versuch fehlschlägt, wird die Suche abgebrochen.)
RÜCKGABEWERT¶
Die
exec()-Funktionen kehren nur in das aufrufende Programm zurück,
wenn ein Fehler aufgetreten ist. Der Rückgabewert ist -1 und
errno
wird auf die entsprechende Fehlerkennung gesetzt.
FEHLER¶
Alle diese Funktionen können fehlschlagen und
errno auf jeden
möglichen Fehler setzen, der für
execve(2) angegeben ist.
VERSIONEN¶
Die Funktion
execvpe() kam erstmals in Glibc 2.11 vor.
POSIX.1-2001, POSIX.1-2008.
Die Funktion
execvpe() ist eine GNU-Erweiterung.
ANMERKUNGEN¶
Auf einigen anderen Systemen befindet sich das aktuelle Arbeitsverzeichnis als
Maßnahme gegen Trojanische Pferde im Standardpfad (wird verwendet, wenn
die Umgebung die Variable
PATH nicht enthält) hinter
/bin
und
/usr/bin. Linux verwendet hier den traditionellen Standardpfad mit
dem »aktuellen Verzeichnis zuerst«.
Das Fehlerverhalten von
execlp() und
execvp() beim Versuch
Programme zu starten ist historische Praxis und traditionell undokumentiert.
Daher ist dieses Verhalten auch nicht durch den POSIX-Standard spezifiziert.
BSD (und möglicherweise andere Systeme) schlafen automatisch und
wiederholen den Versuch, wenn
ETXTBSY angetroffen wird. Linux behandelt
es wie einen harten Fehler und kehrt sofort zurück.
Traditionell ignorierten die Funktionen
execlp() und
execvp() alle
Fehler bis auf die oben beschriebenen sowie
ENOMEM und
E2BIG,
bei deren Auftreten sie ins Hauptprogramm zurückkehrten. Sie kehren jetzt
ins Hauptprogramm zurück, wenn ein anderer Fehler als die oben
beschriebenen auftritt.
SIEHE AUCH¶
sh(1),
execve(2),
fork(2),
ptrace(2),
fexecve(3),
environ(7)
KOLOPHON¶
Diese Seite ist Teil der Veröffentlichung 3.42 des Projekts Linux-
man-pages. Eine Beschreibung des Projekts und Informationen, wie Fehler
gemeldet werden können, finden sich unter
http://www.kernel.org/doc/man-pages/.
ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von Roland Krause
<Rokrause@aol.com>, Martin Schulze <joey@infodrom.org> und Martin
Eberhard Schauer <Martin.E.Schauer@gmx.de> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public
License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird
KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.