exec, execl, execle, execlp, execv, execve, execvp, exect oder fexecve Subroutine
Zweck
Führt eine Datei aus.
Bibliothek
Standard-C-Bibliothek (libc.a)
Syntax
#include <unistd.h> extern
char **environ; int execl (
Path,
Argument0 [, Argument1, ...], 0)
const char *Path, *Argument0, *Argument
1, ...;int execle (
Path,
Argument0 [, Argument1, ...], 0,
EnvironmentPointer)
const
char *Path, *Argument0, *Argum
ent
1, ...;
char *const EnvironmentPointer[ ]; int execlp (
File,
Argument0 [, Argument1
, ...], 0)
const char *File, *Argument0, *Argument
1, ...; int execv (
Path,
ArgumentV)
const char *Path;
char *const ArgumentV[ ];int execve (
Path,
ArgumentV,
EnvironmentPointer)
const char *Path;
char
*const ArgumentV[ ], *EnvironmentPointer
[ ];int execvp (
File,
ArgumentV)
const char *File;
char *const ArgumentV[ ]; int exect (
Path,
ArgumentV,
EnvironmentPointer)
char *Path, *ArgumentV, *EnvironmentPointer [ ];int fexecve (FileDescriptor, ArgumentV, EnvironmentPointer)
int FileDescriptor;
char *const ArgumentV[ ], *EnvironmentPointer[ ]; Beschreibung
Die Subroutine Exec führt in allen Formaten ein neues Programm im aufrufenden Prozess aus. Die Subroutine Exec erstellt keinen neuen Prozess, sondern überschreibt das aktuelle Programm mit einem neuen, als Bild für neuen Prozessbezeichneten Programm. Die Imagedatei für neue Prozesse kann einen von drei Dateitypen aufweisen:
- Eine ausführbare Binärdatei im XCOFF-Dateiformat
- Eine ausführbare Textdatei, die eine Shellprozedur enthält (nur die Subroutinen Execlp und Execvp lassen diesen Typ von Imagedatei für neue Prozesse zu)
- Eine Datei, die eine ausführbare Binärdatei oder Shellprozedur benennt, die ausgeführt wird
Die Subroutine fexecve ist äquivalent zur Subroutine Ausführen , mit der Ausnahme, dass die Subroutine fexecve den Dateideskriptor einer offenen Datei als ersten Parameter anstelle eines Pfadnamens verwendet. Es gilt jedoch Folgendes:
- Wenn die Datei eine Shellprozedur ist, die nach der Operation zum Öffnen gelöscht wird, startet die Subroutine fexecve die Shell, aber die Shell kann die Datei nicht finden.
- Wenn es sich bei der Datei um eine Shellprozedur handelt und das übergeordnete Verzeichnis der Datei nach dem Öffnen der Datei gelöscht wird, gibt die Subroutine fexecve den Fehlercode ENOENT zurück.
- Die Subroutine fexecve überprüft nicht die Ausführungsberechtigung der rollenbasierten Zugriffssteuerung (RBAC).
Das neue Prozessimage übernimmt die folgenden Attribute aus dem aufrufenden Prozessimage: Sitzungszugehörigkeit, zusätzliche Gruppen-IDs, Prozesssignalmaske und anstehende Signale.
Der letzte der genannten Typen wird von einem Header mit folgender Syntax erkannt:
#! Path [String]#! Die Datei Dateitypanzeiger, die den Dateityp angibt. Der Pfadname der auszuführenden Datei wird durch den Parameter Pfad angegeben. Der Parameter Zeichenfolge ist eine optionale Zeichenfolge, die keine Tabulatorzeichen oder Leerzeichen enthält. Falls angegeben, wird diese Zeichenfolge als Argument vor dem Namen der Imagedatei für den neuen Prozess an den neuen Prozess übergeben. Der Header muss mit einem Zeilenvorschubzeichen beendet werden. Beim Aufruf übergibt der neue Prozess den Parameter Path als ArgumentV[0]. Wenn in der neuen Prozessabbilddatei ein String-Parameter angegeben ist, setzt das Unterprogramm exec ArgumentV[0] auf die Werte des String- und Path-Parameters, die miteinander verkettet sind. Die übrigen übergebenen Argumente entsprechen den an die Subroutine Exec übergebenen Argumenten.
Die Subroutine Exec versucht, ausstehende Asynchrone E/A-Anforderungen durch diesen Prozess abzubrechen. Wenn die asynchronen E/A-Anforderungen nicht abgebrochen werden können, wird die Anwendung blockiert, bis die Anforderungen abgeschlossen sind.
Die Subroutine Exec ähnelt der Subroutine Laden , außer dass die Subroutine Exec keinen expliziten Bibliothekspfadparameter hat. Stattdessen verwendet die Subroutine exec entweder die Umgebungsvariable LIBPATH oder LD_LIBRARY_PATH . Wenn die Variable LIBPATH gesetzt ist, wird sie für LD_LIBRARY_PATHverwendet. Andernfalls wird LD_LIBRARY_PATH verwendet. Diese Bibliothekspfadvariablen werden ignoriert, wenn das Programm, für das die Subroutine Exec ausgeführt wird, über mehr Berechtigungen verfügt als das aufrufende Programm (beispielsweise ein suid -Programm).
Die Subroutine Exect ist zur Kompatibilität mit älteren Programmen enthalten, für die mit dem Befehl ptrace ein Trace erstellt wird. Das Programm, das ausgeführt wird, wird in den Hardware-Einzelschrittmodus erzwungen.
Parameter
| Element | Beschreibung |
|---|---|
| Pfad | Gibt einen Zeiger auf den Pfadnamen der Imagedatei für den neuen Prozess an. Wenn Network File System (NFS) auf Ihrem System installiert ist, kann dieser Pfad zu einem anderen Knoten wechseln. Die Daten werden in den lokalen virtuellen Speicher kopiert, bevor Sie fortfahren. |
| Datei | Gibt einen Zeiger auf den Namen der Imagedatei des neuen Prozesses an. Wenn der Parameter Datei kein vollständiger Pfadname ist, wird das Pfadpräfix für die Datei abgerufen, indem die in der Umgebungsvariablen PFAD angegebenen Verzeichnisse durchsucht werden. Die Anfangsumgebung wird von der Shell bereitgestellt. Anmerkung: Die Subroutine Execlp und die Subroutine Execvp verwenden Parameter Datei , aber die übrigen Subroutinen Exec nehmen Parameter Pfad an. (Informationen zur Umgebung finden Sie in der Beschreibung der sonstigen Funktion Umgebung und des Befehls Sh .)
|
| Argument0 [, Argument1, ...] | Verweist auf auf auf null endende Zeichenfolgen. Die Zeichenfolgen stellen die Argumentliste dar, die für den neuen Prozess verfügbar ist. Gemäß Konvention muss mindestens der Parameter Argument0 vorhanden sein und auf eine Zeichenfolge verweisen, die mit dem Parameter Pfad oder seiner letzten Komponente identisch ist. |
| ArgumentV | Gibt ein Array von Zeigern auf auf null endende Zeichenfolgen an. Diese Zeichenfolgen stellen die Argumentliste dar, die dem neuen Prozess zur Verfügung steht. Gemäß Konvention muss der Parameter ArgumentV mindestens ein Element enthalten und auf eine Zeichenfolge verweisen, die mit dem Parameter Pfad oder seiner letzten Komponente identisch ist. Das letzte Element des Parameters ArgumentV ist ein Nullzeiger. |
| EnvironmentPointer | Ein Array von Zeigern auf auf null endende Zeichenfolgen. Diese Zeichenfolgen bilden die Umgebung für den neuen Prozess. Das letzte Element des Parameters EnvironmentPointer ist ein Nullzeiger. |
| FileDescriptor | Gibt den Dateideskriptor einer offenen Datei an, die ausgeführt werden soll |
Wenn ein C-Programm ausgeführt wird, erhält es die folgenden Parameter:
main (ArgumentCount, ArgumentV, EnvironmentPointer)
int ArgumentCount;
char *ArgumentV[ ], *EnvironmentPointer[
];In diesem Beispiel ist der Parameter ArgumentCount der Argumentzähler und der Parameter ArgumentV ein Array von Zeichenzeigern auf die Argumente selbst. Der Wert des Parameters ArgumentCount beträgt vereinbarungsgemäß mindestens 1, und der Parameter ArgumentV[0] zeigt auf eine Zeichenfolge, die den Namen der Bilddatei für den neuen Prozess enthält.
Die Routine Hauptfenster eines Programms in der Programmiersprache C beginnt automatisch mit einer Startroutine zur Laufzeit. Diese Routine setzt die globale Variable environ so, dass sie auf das Umgebungsarray verweist, das an das Programm in EnvironmentPointerübergeben wird. Sie können auf diese globale Variable zugreifen, indem Sie die folgende Deklaration in Ihr Programm einschließen:
extern char **environ;Die Subroutinen Execl, Execv, Execlpund Execvp verwenden die globale Variable Umgebung , um die aktuelle Umgebung des aufrufenden Prozesses an den neuen Prozess zu übergeben.
Dateideskriptoren, die im aufrufenden Prozess geöffnet sind, bleiben geöffnet, mit Ausnahme derjenigen, für die das Flag Close-on-Exec gesetzt ist. Für die Dateideskriptoren, die geöffnet bleiben, bleibt der Dateizeiger unverändert. (Informationen zur Dateisteuerung enthält die Datei fcntl.h .)
Die Deskriptoren für den Status der Konvertierung und den Nachrichtenkatalog im neuen Prozessimage sind nicht definiert. Für den neuen Prozess wird beim Start ein Äquivalent der Subroutine setlocale ausgeführt, die den Wert LC_ALLE für seine Kategorie und den Wert "K" für seine Ländereinstellung angibt.
Wenn für das neue Programm gemeinsam genutzte Bibliotheken erforderlich sind, sucht die Subroutine Exec diese, öffnet sie und lädt sie in den Adressraum des neuen Prozesses. Die Anzahl der referenzierten gemeinsam genutzten Bibliotheken, die vom Aussteller der Exec verwendet werden, wird verringert. Gemeinsam genutzte Bibliotheken werden in den Verzeichnissen gesucht, die in der Umgebungsvariablen LIBPFAD aufgelistet sind. Wenn eine dieser Dateien fern ist, werden die Daten in den lokalen virtuellen Speicher kopiert.
Die Exec -Subroutinen setzen alle abgefangenen Signale auf die Standardaktion zurück. Signale, die die Standardaktion verursachen, werden nach den Exec -Subroutinen weiterhin ausgeführt. Ignorierte Signale bleiben ignoriert, die Signalmaske bleibt gleich und der Signalstapelzustand wird zurückgesetzt. (Informationen zu Signalen finden Sie in der Unterroutine Berechtigungsaktion .)
Wenn das SetUserID der Abbilddatei des neuen Prozesses gesetzt ist, setzt das Unterprogramm exec die effektive Benutzer-ID des neuen Prozesses auf die Eigentümer-ID der Abbilddatei des neuen Prozesses. Wenn das SetGroupID der Abbilddatei des neuen Prozesses gesetzt ist, wird die effektive Gruppen-ID des neuen Prozesses auf die Gruppen-ID der Abbilddatei des neuen Prozesses gesetzt. Die reale Benutzer-ID und die reale Gruppen-ID des neuen Prozesses bleiben mit denen des aufrufenden Prozesses identisch. (Informationen zu den Modi SetID finden Sie in der Unterroutine chmod .)
Am Ende der Exec -Operation werden die gespeicherte Benutzer-ID und die gespeicherte Gruppen-ID des Prozesses immer auf die effektive Benutzer-ID bzw. die effektive Gruppen-ID des Prozesses gesetzt.
Wenn eines oder beide der Set-ID-Modusbits gesetzt ist und die auszuführende Datei eine ferne Datei ist, durchlaufen die Dateibenutzer-und Gruppen-IDs die abgehende Umsetzung auf dem Server. Anschließend werden sie an den Clientknoten übertragen, wo sie gemäß der Umsetzungstabelle für eingehende Anforderungen umgesetzt werden. Diese übersetzten IDs werden die Benutzer-und Gruppen-IDs des neuen Prozesses.
Die Profilerstellung ist für den neuen Prozess inaktiviert.
Der neue Prozess übernimmt die folgenden Attribute vom aufrufenden Prozess:
- Prioritätszahl (siehe Subroutine Priorität abrufen , Subroutine Priorität festlegen , Subroutine Nizza )
- Prozess-ID
- Prozess-ID des Elternprozesses
- Prozessgruppen-ID
- Werte für Semadj (siehe Unterroutine Semop )
- tty-Gruppen-ID (siehe Exit-, Atexit-oder _beenden -Subroutine, Berechtigungsaktion -Subroutine)
- Flag Trace (siehe Anforderung 0 der Subroutine ptrace )
- Verbleibende Zeit bis zu einem Weckersignal (siehe Unterprogramm incinterval, Unterprogramm setitimer und Unterprogramm alarm )
- Aktuelles Verzeichnis
- Stammverzeichnis
- Erstellungsmaske für Dateimodus (siehe Subroutine umfragen )
- Begrenzung der Dateigröße (siehe Subroutine ULimit )
- Ressourcengrenzwerte (siehe Subroutine Getrlimit , Subroutine Setrlimit und Subroutine vlimit )
- tms_utime,tms_stime,tms_cutimeundtms_ctimeFelder der Tms -Struktur (siehe Subroutine Mal )
- Anmelde-ID
Nach erfolgreichem Abschluss markieren die Exec -Subroutinen diest_atimeFeld der Datei.
Beispiele
- Geben Sie Folgendes ein, um einen Befehl auszuführen und ihm einen Parameter zu übergeben:
Die Subroutine Execlp durchsucht jedes in der Umgebungsvariablen PFAD aufgelistete Verzeichnis nach dem Befehl L und überschreibt dann das aktuelle Prozessimage mit diesem Befehl. Die Subroutine Execlp wird nur zurückgegeben, wenn der Befehl L nicht ausgeführt werden kann.execlp("ls", "ls", "-al", 0);Anmerkung: In diesem Beispiel wird der Shellbefehlsprozessor nicht ausgeführt, daher sind Operationen, die von der Shell interpretiert werden, wie z. B. die Verwendung von Platzhalterzeichen in Dateinamen, nicht gültig. - Geben Sie Folgendes ein, um die Shell zur Interpretation eines Befehls auszuführen:
Dadurch wird der Befehl Sh mit dem Flag -c ausgeführt, das angibt, dass der folgende Parameter der zu interpretierende Befehl ist: In diesem Beispiel wird die Subroutine execl anstelle der Subroutine execlp verwendet, weil der vollständige Pfadname /usr/bin/sh angegeben ist, was eine Pfadsuche unnötig macht.execl("/usr/bin/sh", "sh", "-c", "ls -l *.c", 0);Die Ausführung eines Shellbefehls in einem untergeordneten Prozess ist im Allgemeinen nützlicher als die einfache Verwendung der Subroutine Exec , wie in diesem Beispiel gezeigt. Die einfachste Möglichkeit ist die Verwendung der Subroutine System .
- Im Folgenden sehen Sie ein Beispiel für eine neue Prozessdatei, die ein auszuführendes Programm benennt:
Wenn diese Datei benannt istreverse, indem Sie den folgenden Befehl in der Befehlszeile eingeben:#! /usr/bin/awk -f { for (i = NF; i > 0; --i) print $i }
Dieser Befehl führt den folgenden Befehl aus:reverse chapter1 chapter2/usr/bin/awk -f reverse chapter1 chapter2Anmerkung: Die Exec -Subroutinen verwenden nur die erste Zeile der Imagedatei des neuen Prozesses und ignorieren den Rest der Datei. Außerdem interpretiert der Befehl Awk den Text, der auf ein Nummernzeichen (#) folgt, als Kommentar.
Rückgabewerte
Nach erfolgreicher Beendigung werden die Exec -Subroutinen nicht zurückgegeben, weil das Image des aufrufenden Prozesses vom Image des neuen Prozesses überlagert wird. Wenn die exec-Unterprogramme an den aufrufenden Prozess zurückkehren, wird der Wert -1 zurückgegeben und die globale Variable errno gesetzt, um den Fehler zu identifizieren.
Fehlercodes
Wenn die Subroutine Exec nicht erfolgreich ist, gibt sie mindestens einen der folgenden Fehlercodes zurück:
| Element | Beschreibung |
|---|---|
| EACCES | Die Imagedatei des neuen Prozesses ist keine normale Datei. |
| EACCES | Der Modus der Imagedatei für neue Prozesse verweigert die Ausführungsberechtigung. |
| ENOEXEC | Die Subroutine Exec ist weder eine Execlp -Subroutine noch eine Execvp -Subroutine. Die Imagedatei für den neuen Prozess hat die entsprechende Zugriffsberechtigung, aber der Dateitypanzeiger im Header ist ungültig. |
| ENOEXEC | Der Header der Imagedatei für neue Prozesse enthält einen gültigen Dateitypanzeiger, aber der Header ist beschädigt oder für die Maschine, auf der die Datei ausgeführt werden soll, falsch. |
| ETXTBSYCity in SY | Die Imagedatei des neuen Prozesses ist eine reine Prozedurdatei (gemeinsam genutzte Textdatei), die derzeit von einem Prozess zum Schreiben geöffnet ist. |
| ENOMEM | Der neue Prozess erfordert mehr Speicher, als das vom System festgelegte Maximum, die Compileroption MAXMEM (MAXIMUM) , zulässt. |
| E2BIG | Die Anzahl der Byte in der Argumentliste für neue Prozesse ist größer als der vom System festgelegte Grenzwert. Dieser Grenzwert ist ein konfigurierbarer Systemwert, der von Superusern oder Systemgruppenbenutzern mit SMIT festgelegt werden kann. Details finden Sie in Optimierbare Kernelparameter . |
| EFAULT | Der Path-, ArgumentV- oder EnvironmentPointer zeigt außerhalb des Prozessadressraums. |
| EPERM | Das SetUserID oder SetGroupID ist in der Prozessabbilddatei gesetzt. Die Umsetztabellen auf dem Server oder Client lassen keine Umsetzung dieser Benutzer oder Gruppen-ID zu. |
Wenn die Subroutine Exec aufgrund einer Bedingung, die eine Pfadnamensauflösung erfordert, nicht erfolgreich ist, gibt sie einen oder mehrere der folgenden Fehlercodes zurück:
| Element | Beschreibung |
|---|---|
| EACCES | Suchberechtigung für eine Komponente des Pfadpräfix verweigert. Der Zugriff konnte aufgrund eines sicheren Mounts verweigert werden. |
| EFAULT | Der Parameter Pfad verweist außerhalb des zugeordneten Adressraums des Prozesses. |
| EIO | Während der Operation ist ein Ein-/Ausgabefehler aufgetreten. |
| ELOOP (SCHLEIFE) | Beim Umsetzen des Parameters Pfad wurden zu viele symbolische Links gefunden. |
| ENAMETOOLONG | Eine Komponente eines Pfadnamens überschreitet 255 Zeichen und der Prozess verfügt über das Attribut Abschneiden nicht zulassen (siehe die Subroutine ULimit ) oder ein vollständiger Pfadname überschreitet 1023 Zeichen. |
| ENOENT | Eine Komponente des Pfadpräfix ist nicht vorhanden. |
| ENOENT | Eine symbolische Verbindung wurde benannt, aber die Datei, auf die sie verweist, ist nicht vorhanden. |
| ENOENT | Der Pfadname ist null. |
| ENOTDIR | Eine Komponente des Pfadpräfix ist kein Verzeichnis. |
| ESTALE | Das Stammverzeichnis oder das aktuelle Verzeichnis des Prozesses befindet sich in einem virtuellen Dateisystem, das abgehängt wurde. |
Darüber hinaus können einige Fehler auftreten, wenn die neue Prozessdatei verwendet wird, nachdem das alte Prozessimage überschrieben wurde. Zu diesen Fehlern gehören Probleme beim Einrichten neuer Daten-und Stackregister, Probleme beim Zuordnen einer gemeinsam genutzten Bibliothek oder Probleme beim Lesen der neuen Prozessdatei. Da die Rückkehr zum aufrufenden Prozess nicht möglich ist, sendet das System das Signal ANMELDUNG an den Prozess, wenn einer dieser Fehler auftritt.
Wenn beim Zuordnen einer gemeinsam genutzten Bibliothek ein Fehler aufgetreten ist, wird eine Fehlernachricht mit einer Beschreibung der Fehlerursache in die Standardfehlerausgabe geschrieben, bevor das Signal ANMELDUNG an den Prozess gesendet wird. Wenn eine gemeinsam genutzte Bibliothek nicht zugeordnet werden kann, gibt die Subroutine einen der folgenden Fehlercodes zurück:
| Element | Beschreibung |
|---|---|
| ENOENT | Mindestens eine Komponente des Pfadnamens der gemeinsam genutzten Bibliotheksdatei ist nicht vorhanden. |
| ENOTDIR | Eine Komponente des Pfadpräfix der gemeinsam genutzten Bibliotheksdatei ist kein Verzeichnis. |
| ENAMETOOLONG | Eine Komponente eines Pfadnamenspräfix einer gemeinsam genutzten Bibliotheksdatei überschreitet 255 Zeichen oder ein vollständiger Pfadname überschreitet 1023 Zeichen. |
| EACCES | Die Suchberechtigung für ein im Pfadpräfix der gemeinsam genutzten Bibliotheksdatei aufgelistetes Verzeichnis wird verweigert. |
| EACCES | Der Dateimodus der gemeinsam genutzten Bibliothek verweigert die Ausführungsberechtigung. |
| ENOEXEC | Die gemeinsam genutzte Bibliotheksdatei hat die entsprechende Zugriffsberechtigung, aber ein Dateitypanzeiger im Header ist nicht gültig. |
| ETXTBSYCity in SY | Die gemeinsam genutzte Bibliotheksdatei ist zurzeit zum Schreiben durch einen anderen Prozess geöffnet. |
| ENOMEM | Die gemeinsam genutzte Bibliothek benötigt mehr Speicher, als das vom System festgelegte Maximum zulässt. |
| ESTALE | Das Prozessstammverzeichnis oder das aktuelle Verzeichnis befindet sich in einem virtuellen Dateisystem, das abgehängt wurde. |
| EPROCLIM | Wenn WLM aktiv ist, wurde der Grenzwert für die Anzahl der Prozesse, Threads oder Anmeldungen in der Klasse möglicherweise erreicht. |
Wenn die Subroutine fexecve nicht erfolgreich ist, wird möglicherweise auch einer der folgenden Fehlercodes zurückgegeben:
| Element | Beschreibung |
|---|---|
| EBADF | Das Argument FileDescriptor gibt keinen gültigen offenen Dateideskriptor an. |
| ENOENT | Das Argument FileDescriptor verweist auf eine Shellprozedur, aber das ursprüngliche übergeordnete Verzeichnis der Datei wurde gelöscht. |
Wenn NFS auf dem System installiert ist, kann die Subroutine exec auch fehlschlagen, wenn Folgendes zutrifft:
| Element | Beschreibung |
|---|---|
| EZEITDOUT | Das Zeitlimit für die Verbindung wurde überschritten. |