exec(2) exec(2)
NAME
exec: execl, execv, execle, execve, execlp, execvp - Datei ausführen
SYNTAX
#include <unistd.h>
int execl(const char *path, const char *arg0, ...,
const char *argn, (char *)0);
int execv(const char *path, char *const *argv);
int execle(const char *path, const char *arg0, ...,
const char *argn, (char *0), const char *envp[]);
int execve(const char *path, char *const *argv,
char *const envp[]);
int execlp(const char *file, const char *arg0, ...,
const char *argn, (char *)0);
int execvp(const char *file, char *const *argv);
BESCHREIBUNG
exec überlagert in allen seinen Formen einen alten Prozeß mit einem
neuen Prozeß. Der neue Prozeß wird von einer regulären ausführbaren
Datei erzeugt. Diese Datei ist entweder eine ausführbare Objektdatei
oder eine Datendatei für einen Interpreter. Von einem erfolgreichen
exec-Aufruf kann nicht zurückgekehrt werden, da das Abbild des aufru-
fenden Prozesses von dem neuen Prozeß überlagert wird.
Eine Interpreter-Datei beginnt mit einer Zeile der Form
#! pathname [arg]
wobei der pathname der Pfad des Interpreters und arg ein optionales
Argument ist. Wenn eine Interpreter-Datei ausgeführt wird, führt das
System den angegebenen Interpreter aus. Der angegebene Pfadname wird
als arg0 an den Interpreter übergeben. Wenn arg in der Interpreter-
Datei angegeben wurde, wird es als arg1 an den Interpreter übergeben.
Die verbleibenden Argumente für den Interpreter sind arg0 bis argn der
ursprünglich ausgeführten Datei.
Wird ein C-Programm ausgeführt, wird es wie folgt aufgerufen:
int main(int argc, char *argv[], char *envp[]);
Hierbei ist argc der Argumentzähler, argv ein Feld von Zeigern auf die
Argumente selbst und envp ein Feld von Zeigern auf die Umgebungsvaria-
blen. argc ist mindestens 1, und das erste Element des Feldes weist
auf eine Zeichenkette, die den Namen der Programmdatei enthält.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
exec(2) exec(2)
path weist auf einen Pfadnamen, der die neue Programmdatei des Prozes-
ses bezeichnet.
file weist auf die neue Programmdatei des Prozesses. Wenn file einen
Schrägstrich enthält, wird dieses Argument als Pfadname der Datei
angesehen. Wenn file keinen Schrägstrich enthält, wird der Pfad für
diese Datei durch Durchsuchen der Verzeichnisse gefunden, die in der
Umgebungsvariablen PATH definiert werden [siehe environ(5)]. Die Umge-
bung wird typischerweise von der Shell bereitgestellt [siehe sh(1)].
Wenn die neue Prozeßdatei keine ausführbare Objektdatei ist, verwenden
execlp() und execvp() den Inhalt dieser Datei als Standardeingabe für
sh(1).
Die Argumente arg0, ..., argn zeigen auf Zeichenketten, die mit dem
Null-Byte abgeschlossen sind. Diese Zeichenketten stellen die Argu-
mentliste dar, die für das neue Prozeßabbild zur Verfügung steht.
Wenigstens arg0 muß vorhanden sein. Es wird der Name des Prozesses,
wie er vom Kommando ps angezeigt wird. arg0 zeigt auf eine Zeichen-
kette, die dieselbe wie path (oder die letzte Komponente von path)
ist. Die Liste der Argumentzeichenketten wird durch ein Argument
(char *)0 beendet.
argv ist ein Feld von Zeigern auf Zeichenketten, die mit dem Null-Byte
abgeschlossen sind. Diese Zeichenketten stellen die Argumentliste dar,
die dem neuen Prozeßabbild zur Verfügung steht. argv hat wenigstens
ein Element, das auf eine Zeichenkette weist, die dieselbe wie path
(oder ihre letzte Komponente) ist. argv wird mit einem Nullzeiger
abgeschlossen.
envp ist ein Feld von Zeigern auf Zeichenketten, die mit dem Null-Byte
abgeschlossen sind. Diese Zeichenketten stellen die Umgebung für das
neue Prozeßabbild dar. envp wird mit einem Nullzeiger abgeschlossen.
Bei execl(), execv(), execvp() und execlp() setzt die C-Laufzeit-
Startroutine einen Zeiger auf die Umgebung des aufrufenden Prozesses
in dem globalen Objekt extern char **environ, und diese wird zum Wei-
terreichen der Umgebung des aufrufenden Prozesses an den neuen Prozeß
verwendet.
Die Dateien, die im aufrufenden Prozeß offen sind, bleiben auch im
neuen Prozeß offen. Eine Ausnahme bilden dabei jene Dateien, deren
Status-Bit für "Schließen-bei-exec" gesetzt ist [siehe fcntl(2)]. Bei
Dateideskriptoren, die offen bleiben, wird der Schreib-/Lesezeiger
nicht verändert.
Für jene Signale, die im aufrufenden Prozeß abgefangen werden, wird im
neuen Prozeßabbild die Standardeinstellung eingestellt [siehe
signal(2)]. In den anderen Fällen erbt das neue Prozeßabbild die Ein-
stellungen bezüglich der Signale vom aufrufenden Prozeß.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
exec(2) exec(2)
Nach dem erfolgreichen Aufruf einer der exec-Funktionen sind alle vor-
her von atexit() registrierten Funktionen nicht mehr registriert.
Wenn das Bit zum Setzen der Benutzernummer bei Ausführung in der neuen
Programmdatei des Prozesses gesetzt ist [siehe chmod(2)], setzt exec
die effektive Benutzernummer des neuen Prozesses auf die Benutzernum-
mer der neuen Prozeßdatei. Entsprechend wird bei gesetztem Bit zum
Setzen der Gruppennummer bei Ausführung die effektive Gruppennummer
des neuen Prozesses auf die Gruppennummer der Prozeßdatei gesetzt. Die
reale Benutzernummer und die reale Gruppennummer des neuen Prozesses
bleiben dieselben wie beim aufrufenden Prozeß. Darüber hinaus wird bei
gesetztem Bit zum Setzen der Benutzernummer der neuen Prozeßdatei und
bei Nichtidentität von realer und effektiver Benutzernummer der Grenz-
wert der Datei auf den Standardwert des Systems gesetzt.
Ist die effektive Benutzerkennung gleich root oder gleich Systemver-
walter, so werden die "set-user-ID"- und "set-group-ID"-Bits berück-
sichtigt, vorausgesetzt, der Prozeß wird durch ptrace() überwacht.
Die gemeinsam benutzten Speichersegmente (Shared Memory Segments), die
dem aufrufenden Prozeß zugeordnet waren, werden dem neuen Prozeß nicht
zugeordnet [siehe shmop(2)]. Für den neuen Prozeß wird das Profilieren
abgeschaltet [siehe profil(2)]. Außerdem übernimmt der neue Prozeß
noch folgende Attribute vom aufrufenden Prozeß:
- nice-Wert [siehe nice(2)]
- Prozeßklasse und Priorität [siehe priocntl(2)]
- Prozeßnummer
- Prozeßnummer des Vaters
- Prozeßnummer der Gruppe
- reale Benutzernummer
- reale Gruppennummer
- zusätzliche Gruppennummern
- semadj-Werte [siehe semop(2)]
- Sitzungsnummer [siehe exit(2) und signal(2)]
- Ablaufverfolgungsanzeiger [siehe ptrace(2), request 0)
- Restzeit, bis zu einem Alarmuhr-Signal [siehe alarm(2)]
- aktuelles Verzeichnis
- "root"-Verzeichnis
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
exec(2) exec(2)
- Schutzbitmaske des Prozesses [siehe umask(2)]
- Grenzwerte für Dateien [siehe ulimit(2) und getrlimit(2)]
- Betriebsmittel-Grenzwerte [siehe getrlimit(2)]
- tmsutime(), tmsstime(), tmscutime() und tmscstime [siehe
times(2)]
- Dateisperren [siehe fcntl(2) und lockf(3C)]
- steuerndes Terminal
- Prozeß-Signalmaske [siehe sigprocmask(2)]
- unbearbeitete Signale [siehe sigpending(2)]
Bei erfolgreicher Ausführung sieht exec die Veränderung des statime-
Feldes der Datei vor. Sollte exec erfolgreich ausgeführt worden sein,
so wird die Datei des Prozeßabbilds als mit open() geöffnet betrach-
tet. Das zugehörige close() erfolgt konzeptionell nach dem Öffnen,
aber vor dem Prozeßende oder einer erfolgreichen Bearbeitung eines
weiteren Aufrufs von exec.
FEHLER
Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
errno(5).
exec ist erfolglos und kehrt zum aufrufenden Prozeß zurück, wenn einer
oder mehrere der nachstehenden Punkte zutreffen:
EACCES In einem der Verzeichnisse, die im Pfad der Datei des
neuen Prozesses aufgelistet sind, ist keine Erlaubnis
zum Durchsuchen gegeben.
E2BIG Die Anzahl der Bytes in der Argumentliste des neuen Pro-
zesses ist größer als die systembedingte Obergrenze von
20480 Bytes. Die Obergrenze der Argumentliste ist die
Summe der Größe der Argumentliste plus die Größe der von
der Umgebung exportierten Shell-Variablen.
EACCES Die neue Prozeßdatei ist keine reguläre Datei.
EACCES Der Modus der neuen Prozeßdatei erlaubt keine Ausfüh-
rung.
EAGAIN Die Gesamtmenge des Systemspeichers, die während des
Lesens über zeichenorientierte E/A verfügbar ist, reicht
zeitweise nicht aus.
EFAULT Angeforderte Hardware ist nicht vorhanden.
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
exec(2) exec(2)
EFAULT Ein a.out, das mit MAU oder dem 32B-Schalter übersetzt
wurde, läuft auf einem Rechner ohne ein MAU oder 32B.
EFAULT Ein Argument zeigt auf eine ungültige Adresse.
EINTR Ein Signal wurde während des Systemaufrufs exec abgefan-
gen.
ELIBACC Angeforderte, gemeinsam benutzte Bibliothek hat keine
Ausführerlaubnis.
ELIBEXEC Es wird versucht, eine gemeinsam benutzte Bibliothek
direkt mit exec auszuführen.
ELOOP Beim Übersetzen von path oder file wurden zuviele symbo-
lische Verweise angetroffen.
EMULTIHOP Die Komponenten von path erfordern den Sprung auf meh-
rere ferne Rechner, und der Dateisystemtyp erlaubt das
nicht.
ENAMETOOLONG Die Länge des file- oder path-Arguments oder ein Element
der Umgebungsvariable PATH als Dateipräfix übertrifft
PATHMAX, oder die Länge einer file- oder path-Kompo-
nente übertrifft NAMEMAX.
ENOENT Eine oder mehrere Komponenten des Pfadnamens des neuen
Prozesses der Datei existieren nicht, oder er ist gleich
Null.
ENOTDIR Eine Komponente des neuen Prozeßpfades ist kein Ver-
zeichnis.
ENOEXEC Der exec-Aufruf ist kein execlp() oder execvp(), und die
neue Prozeßdatei hat die entsprechende Zugriffserlaub-
nis, jedoch kein gültiges Format.
ETXTBSY Die Datei ist eine reine Programmdatei (gemeinsam
benutzter Text), die gerade von einem anderen Prozeß
beschrieben wird.
ENOMEM Der neue Prozeß erfordert mehr Speicherplatz als vom
systembedingten Maximum MAXMEM zugelassen wird.
ENOLINK path weist auf einen fernen Rechner, und die Verbindung
zu diesem Rechner ist nicht mehr aktiv.
ERGEBNIS
Wenn exec zu dem aufrufenden Prozeß zurückkehrt, ist ein Fehler aufge-
treten; der Rückgabewert ist dann -1, und errno wird zur Anzeige des
Fehlers gesetzt.
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
exec(2) exec(2)
HINWEISE
Wenn Sie in Ihrer Anwendung nicht die voreingestellten C-Locale ver-
wenden, müssen Sie setlocale(3C) mit den entsprechenden Argumenten
aufrufen, um die Umgebung für den neuen Prozeß einzustellen.
SIEHE AUCH
ps(1), sh(1), alarm(2), exit(2), fcntl(2), fork(2), getrlimit(2),
nice(2), priocntl(2), ptrace(2), semop(2), signal(2), sigpending(2),
sigprocmask(2), times(2), umask(2), atexit(3C), lockf(3C), system(3S),
a.out(4), unistd(4), environ(5), lfs(5).
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98