Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

exec: execl, execv, execle, execve, execlp, execvp, execvpe - Datei ausführen

&pagelevel(4)&pagelevel

Definition

#include <unistd.h>

extern char **environ;

int execl (const char *path, const char *arg0, ... , (char *)0 );
int execv (const char *path, char *const argv[ ]);
int execle (const char *path, const char *arg0, ... , (char *)0, char *const envp[ ] );
int execve (const char *path, char *const argv[ ], const char *envp[ ]);
int execlp (const char *file, const char *arg0, ... , (char *)0 );
int execvp (const char *file, char *const argv[ ]);
int execvpe (const char *file, char *const argv[ ], const char *envp[ ]);

Beschreibung

Die Funktionen der exec-Familie ersetzen das aktuelle Prozessabbild durch ein neues. Das neue Prozessabbild wird aus einer normalen, ausführbaren Datei path oder file erzeugt, die neue Prozessabbilddatei genannt wird. Ein erfolgreicher Aufruf einer exec-Funktion kehrt nicht zurück, da das aufrufende Prozessabbild durch das neue Prozessabbild überlagert wird.

Wenn durch den Aufruf einer exec-Funktion ein C-Programm ausgeführt wird, wird dieses wie folgt als C-Funktionsaufruf angesprungen:

int main (int argc, char *argv []);

Dabei ist argc der Argumentzähler und argv ein Vektor von char-Zeigern auf die Argumente selbst. argc ist mindestens 1, und das erste Element des Feldes weist auf eine Zeichenkette, die den Namen der ausführbaren Datei enthält.

Zusätzlich wird folgende Variable als Adresse eines Vektors von char-Zeigern auf die Umgebungsvariablen zeigen, initialisiert:

extern char **environ;

argv und environ werden durch den Nullzeiger abgeschlossen. Der Nullzeiger, der den Vektor argv abschließt, wird in argc nicht mitgezählt.

Die Argumente, die von einem Programm bei einer der exec-Funktionen angegeben wurden, werden an das neue Prozessabbild über die entsprechenden Argumente von main() übergeben.

path zeigt auf einen Pfadnamen, der die neue Prozessabbilddatei angibt.

file wird benutzt, um den Pfadnamen für die neue Prozessabbilddatei zu erzeugen. Wenn file einen Schrägstrich enthält, wird es als Pfadname der Prozessabbilddatei angesehen. Wenn file keinen Schrägstrich enthält, wird das Pfadpräfix für diese Datei dadurch gefunden, dass die Dateiverzeichnisse durchsucht werden, die durch die Umgebungsvariable PATH definiert sind (siehe Abschnitt "Umgebungsvariablen“). Die Umgebung wird typischerweise von der POSIX-Shell bereitgestellt (siehe auch Handbuch „POSIX-Grundlagen“ [1]). Andere X/Open-kompatible Systeme können für diesen Fall andere Vorgaben definieren.

Wenn die Prozessabbilddatei kein gültiges ausführbares Objekt ist, verwenden execlp() und execvp() den Inhalt dieser Datei als Standardeingabe eines Kommando-Interpreters, analog zu system(). In diesem Fall wird der Kommando-Interpreter das neue Prozessabbild.

arg0, ... sind Zeiger auf Zeichenketten, die mit dem Nullbyte abgeschlossen sind. Diese Zeichenketten bilden die Argumentliste, die dem neuen Prozessabbild zur Verfügung steht. Die Liste wird durch einen Nullzeiger abgeschlossen. Das Argument arg0 sollte auf einen Dateinamen zeigen, der dem Prozess zugeordnet ist, der von einer der exec-Funktionen erzeugt wird.

argv ist ein Vektor aus Zeigern auf Zeichenketten, die mit einem Nullbyte abgeschlossen sind. Das letzte Element dieses Vektors muss ein Nullzeiger sein. Diese Zeichenketten stellen die Argumentliste für das neue Prozessabbild dar. Der Wert argv[0] sollte auf einen Dateinamen zeigen, der mit dem Prozess verbunden ist, der von einer der exec-Funktionen erzeugt wird.

envp ist ein Vektor von Zeigern auf Zeichenketten, die mit dem Nullbyte abgeschlossen sind. Diese Zeichenketten bilden die Umgebung für das neue Prozessabbild. Der Vektor envp wird durch einen Nullzeiger abgeschlossen.

Bei den Funktionen, die envp nicht als Argument übergeben (execl(), execv(), execlp() und execvp()), wird die Umgebung für das neue Prozessabbild aus der externen Variablen environ des aufrufenden Prozesses gewonnen.

Die Anzahl von Bytes, die für die Argument- und Umgebungsliste des Prozesses zur Verfügung steht, ist {ARG_MAX}. Im POSIX-Subsystem schließt die Konstante {ARG_MAX} den Platz für abschließende Nullbytes, Zeiger und/oder Füllbytes mit ein. Andere X/Open-kompatible Systeme können hier andere Vereinbarungen treffen.

Dateideskriptoren des aufrufenden Prozessabbilds bleiben auch im neuen Prozessabbild offen, außer denen, für die das sbe-Bit FD_CLOEXEC gesetzt ist (siehe auch fcntl()). Für die Dateien, die offen bleiben, bleiben auch alle Attribute der Dateibeschreibung bestehen, einschließlich der Dateisperren.

Der Zustand von Umwandlungs- und Meldungskatalog-Deskriptoren im neuen Prozessabbild ist undefiniert. Für den neuen Prozess wird folgendes Äquivalent beim Systemstart ausgeführt:

setlocale(LC_ALL, "C")

Signale, die im aufrufenden Prozessabbild auf die Signalaktion SIG_DFL gesetzt sind, werden im neuen Prozessabbild auf die voreingestellte Signalaktion gesetzt. Signale, die im aufrufenden Prozessabbild ignoriert werden (SIG_IGN), werden auch im neuen Prozessabbild ignoriert. Signale, die im aufrufenden Prozessabbild abgefangen werden, werden im neuen Prozessabbild auf die voreingestellte Signalaktion gesetzt (siehe auch signal.h).

Nach einem erfolgreichen Aufruf einer exec-Funktion sind die vorher mit atexit() registierten Funktionen nicht mehr registriert.

Wenn das s-Bit für den Eigentümer bei der neuen Prozessabbilddatei gesetzt ist (siehe auch chmod()), wird die effektive Benutzernummer des neuen Prozessabbilds auf die Benutzernummer des Eigentümers der neuen Prozessabbilddatei gesetzt. Analog dazu wird, wenn das s-Bit für die Gruppe der neuen Prozessabbilddatei gesetzt ist, die effektive Gruppennummer des neuen Prozessabbilds auf die Gruppennummer der neuen Prozessabbilddatei gesetzt. Die reale Benutzer- und Gruppennummer sowie die zusätzlichen Gruppennummern des neuen Prozessabbilds bleiben dieselben wie die des aufrufenden Prozessabbilds. Die effektive Benutzer- und die effektive Gruppennummer des neuen Prozessabbilds werden für eine Verwendung durch setuid() als die gesicherte Benutzer- und die gesicherte Gruppennummer gespeichert.

Gemeinsam nutzbare Speicherbereiche, die an das aufrufende Prozessabbild angehängt sind, werden nicht an das neue Prozessabbild angehängt (siehe auch shmat()).

Der neue Prozess erhält außerdem folgende Attribute aus dem aufrufenden Prozessabbild:

  • Prioritätswert (siehe auch nice())

  • semadj-Werte (siehe auch semop())

  • Prozessnummer

  • Vaterprozessnummer

  • Prozessgruppennummer

  • Sitzungsnummer

  • reale Benutzernummer

  • reale Gruppennummer

  • zusätzliche Gruppennummern

  • Restzeit bis zu einem Alarmuhr-Signal (siehe auch alarm())

  • aktuelles Dateiverzeichnis

  • Root-Dateiverzeichnis

  • Schutzbitmaske (siehe auch umask())

  • maximale Dateigröße (siehe auch ulimit())

  • Signalmaske (siehe auch sigprocmask())

  • wartende Signale (siehe auch sigpending())

  • tms_utime, tms_stime, tms_cutime und tms_cstime (siehe auch times())

Alle anderen Prozessattribute der XPG4-konformen Bibliotheksfunktionen sind im alten und neuen Prozessabbild identisch.

Bei erfolgreicher Beendigung markieren die exec-Funktionen das Feld st_atime der Datei zum Ändern. Wenn eine exec-Funktion fehlschlägt, aber die Prozessabbilddatei gefunden hatte, ist nicht festgelegt, ob das Feld st_atime zum Ändern markiert ist. Sollte die exec-Funktion erfolgreich sein, nimmt man an, dass die Prozessabbilddatei geöffnet wurde. Das korrespondierende Schließen wird für einen Zeitpunkt nach dem Öffnen angesetzt, aber vor der Beendigung des Prozesses oder der erfolgreichen Beendigung eines nachfolgenden Aufrufs einer der exec-Funktionen.

POSIX-Dateien werden beim Aufruf einer exec-Funktion nur dann geschlossen, wenn das Flag CLOSE_ON_EXEC gesetzt ist.

Werden Threads verwendet, so wirkt sich die Funktion auf den Prozess oder auf einen Thread wie folgt aus:

  • Beim Aufruf einer der exec-Funktionen aus einem Prozess mit mehr als einem Thread werden alle Threads beendet und danach wird das neue ausführbare Programm geladen und ausgeführt. Es werden keine Destruktor-Funktionen aufgerufen.

    BS2000

  • BS2000-Dateien werden beim Aufruf einer exec-Funktion immer geschlossen. (Ende)

Returnwert

-1

bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.

Fehler

Die exec-Funktionen schlagen fehl, wenn gilt:

 

E2BIG

Die Anzahl der Bytes, die von der neuen Argument- und Umgebungsliste des Prozessabbilds verwendet werden, ist größer als die systemspezifische Grenze von {ARG_MAX} Bytes.

 

EACCES

Das Durchsuchrecht für ein Dateiverzeichnis im Pfad-Präfix der neuen Prozessabbilddatei ist nicht gegeben,
oder die neue Prozessabbilddatei verweigert das Ausführrecht,
oder die neue Prozessabbilddatei ist keine normale Datei und die Implementierung unterstützt die Ausführung von Dateien dieses Typs nicht.


Erweiterung

 

EFAULT

Programm konnte nicht geladen werden.

 

EINTR

Ein Signal wurde abgefangen.

 

ELOOP

Beim Übersetzen von path oder file wurden zuviele symbolische Verweise angetroffen. (Ende)


ENAMETOOLONG

 


Die Länge der Argumente path oder file oder ein Element der Umgebungsvariablen PATH, das einer Datei vorangestellt wird, überschreitet {PATH_- MAX}, oder eine Pfadnamen-Komponente ist länger als {NAME_MAX}.


Erweiterung

 

ENOENT

Eine oder mehrere Komponenten des Pfadnamens der neuen Prozessabbilddatei existieren nicht, oder path oder file zeigen auf eine leere Zeichenkette.

 

ENOMEM

Ein neues Prozessabbild erfordert mehr Speicherplatz, als von der Hardware oder den systemspezifischen Speicherverwaltungseinschränkungen zugelassen ist.

 

ENOTDIR

Eine Komponente des Pfad-Präfixes der neuen Prozessabbilddatei ist kein Dateiverzeichnis. (Ende)


Die exec-Funktionen - außer execlp() und execvp() - schlagen fehl, wenn gilt:

 

ENOEXEC

Die neue Prozessabbilddatei besitzt zwar die nötigen Zugriffsrechte, aber nicht das richtige Format.

Hinweise

Da der Zustand von Umwandlungs- und Meldungskatalog-Deskriptoren im neuen Prozessabbild undefiniert ist, sollten sich portable Anwendungen nicht auf deren Verwendung abstützen und diese vor der Verwendung einer der exec-Funktionen schließen.

BS2000

Die Umgebungsvariablen BLSLIB nn (für 00 <= nn <= 98) werden vor dem Laden des auszuführenden Programms beginnend bei BLSLIB00 in aufsteigender Reihenfolge ausgewertet. Der Inhalt der Variablen wird als BS2000-Dateiname interpretiert und ein Link mit dem Variablennamen auf den jeweiligen Dateinamen abgesetzt. Bei der ersten nicht vorhandenen Variablen wird die weitere Suche abgebrochen. Auf jeden Fall aber wird ein Link mit dem Linknamen BLSLIB99 auf die Datei $.SYSLNK.CRTE abgesetzt. Dieses Verfahren ermöglicht es, auch nicht vollständig gebundene Programme, die noch dynamisch Module nachladen müssen, in einem Sohnprozess auszuführen, der die TFT (Terminal File Table) nicht von seinem Vaterprozess erbt. (Ende)

Siehe auch

alarm(), atexit(), exit(), fcntl(), fork(), getenv(), nice(), putenv(), semmop(), setlocale(), shmat(), sigaction(), system(), times(), ulimit(), umask(), unistd.h, Abschnitt "Umgebungsvariablen“.