execl, execlp, execle, execv, execvp, execvpe - führt eine Datei aus
Standard-C-Bibliothek (
libc,
-lc)
#include <unistd.h>
extern char **environ;
int execl(const char *pathname, const char *arg, …
/*, (char *) NULL */);
int execlp(const char *file, const char *arg, …
/*, (char *) NULL */);
int execle(const char *pathname, const char *arg, …
/*, (char *) NULL, char *const envp[] */);
int execv(const char *pathname, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
execvpe():
_GNU_SOURCE
Die
exec()-Funktionsfamilie ersetzt den aktuellen Programmcode im
Speicher mit einem neuen Prozessabbild. Die in dieser Handbuchseite
beschriebenen Bibliotheksfunktionen sind über diejenigen der
Systemfunktion
execve(2) gelegt. (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.
Die Funktionen können, basierend auf den Buchstaben, die dem Namensanfang
»exec« folgen, gruppiert werden.
Der Ausdruck
const char *arg und die nachfolgenden
Auslassungspunkte (»…«) 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 mit einem Nullbyte (»\0«) abgeschlossene
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 Nullzeiger abgeschlossen werden und weil
es variadische Funktionen sind, muss für diesen Zeiger eine
Typumwandlung (cast) zu
(char *) NULL durchgeführt
werden.
Im Gegensatz zu den »l«-Funktionen legen die
»v«-Funktionen (unten) die Befehlszeilenargumente des
ausgeführten Programmes als Vektor fest.
Die Argument
char *const argv[] ist ein im Folgeprogramm
verfügbares Feld von Zeigern auf mit einem Nullbyte abgeschlossene
Zeichenketten, die die Argumentenliste darstellen. Das erste Argument sollte
konventionsgemäß auf den Namen der auszuführenden Datei
weisen. Der Feld von Zeigern
muss mit einem Nullzeiger als letztem
Eintrag abgeschlossen werden.
Die Umgebung für das neue Prozessabbild wird mittels des Arguments
envp festgelegt. Das Argument
envp ist ein Feld von Zeigern auf
mit einem Nullbyte abgeschlossene Zeichenketten und
muss mit einem
Nullzeiger als letztem Eintrag abgeschlossen werden.
Alle anderen
exec()-Funktionen (die kein »e« in der Endung
enthalten) übernehmen die Umgebungsvariablen für den neuen
Prozess von der externen Variablen
environ im aufrufenden Prozess.
Diese Funktionen 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 eine Liste, die die von
confstr(_CS_PATH)
(das typischerweise den Wert »/bin:/usr/bin«
zurückliefert) zurückgelieferten Verzeichnisse enthält
und mglicherweise auch das aktuelle Arbeitsverzeichnis. Lesen Sie ANMERKUNGEN
für weitere Details.
execvpe() sucht nach dem Programm mittels des Werts von
PATH aus
der Umgebung des Aufrufenden, nicht aus dem Argument
envp.
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.)
Alle anderen
exec()-Funktionen (die kein »p« in der Endung
enthalten) akzeptieren als ihr erstes Argument einen (relativen oder
absoluten) Pfadnamen, der das auszuführende Programm identifiziert.
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.
Alle diese Funktionen können fehlschlagen und
errno auf jeden
möglichen Fehler setzen, der für
execve(2) angegeben ist.
Die Funktion
execvpe() kam erstmals in Glibc 2.11 vor.
Siehe
attributes(7) für eine Erläuterung der in diesem
Abschnitt verwandten Ausdrücke.
Schnittstelle |
Attribut |
Wert |
execl(), execle(), execv() |
Multithread-Fähigkeit |
MT-Safe |
execlp(), execvp(), execvpe() |
Multithread-Fähigkeit |
MT-Safe env |
POSIX.1-2001, POSIX.1-2008.
Die Funktion
execvpe() ist eine GNU-Erweiterung.
Der Standardsuchpfad (wird verwandt, wenn die Umgebung nicht die Variable
PATH enthält), zeigt zwischen Systemen einige Variationen. Im
Allgemeinen enthält es
/bin und
/usr/bin (in dieser
Reihenfolge) und kann auch das aktuelle Arbeitsverzeichnis enthalten. Auf
einigen Systemen ist das aktuelle Arbeitsverzeichnis nach
/bin und
/usr/bin enthalten, um Trojanische Pferde zu vermeiden. Die
Glibc-Implementierung folgte lange der traditionellen Vorgabe, bei der das
aktuelle Arbeitsverzeichnis am Anfang des Suchpfades enthalten ist. Aufgrund
einiger Code-Überarbeitungen während der Entwicklung der Glibc
2.24 wurde das aktuelle Arbeitsverzeichnis aus dem Standard-Suchpfad komplett
entfernt. Diese versehentliche Verhaltensänderung wird leicht
nützlich eingeschätzt und wird nicht zurückgenommen.
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.
Vor Glibc 2.24 verwandten
execl() und
execle() intern
realloc(3) und waren daher nicht asynchron-signal-sicher. Dies
verletzte die Anforderungen von POSIX.1. Dies wurde in Glibc 2.24 korrigiert.
Unter Sparc und Sparc64 wird
execv() zur Kompatibilität mit SunOS
durch den Kernel als ein Systemaufruf (mit dem oben gezeigten Prototypen)
bereitgestellt. Diese Funktion wird durch den
execv()-Wrapper auf
diesen Architekturen
nicht eingesetzt.
sh(1),
execve(2),
execveat(2),
fork(2),
ptrace(2),
fexecve(3),
system(3),
environ(7)
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Schulze
<
[email protected]>, Roland Krause <
[email protected]>, Martin
Eberhard Schauer <
[email protected]> und Helge Kreutzmann
<
[email protected]> 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 die
Mailingliste
der Übersetzer