Es gibt kein exec Systemaufruf – dies wird normalerweise verwendet, um auf alle execXX zu verweisen Anrufe als Gruppe. Sie alle tun im Wesentlichen dasselbe:Laden eines neuen Programms in den aktuellen Prozess und Versehen mit Argumenten und Umgebungsvariablen. Die Unterschiede bestehen darin, wie das Programm gefunden wird, wie die Argumente angegeben werden und woher die Umgebung kommt.
-
Die Aufrufe mit
vNehmen Sie im Namen einen Array-Parameter, um denargv[]anzugeben Array des neuen Programms. Das Ende der Argumente wird durch ein Array-Element angezeigt, dasNULLenthält . -
Die Aufrufe mit
lim Namen nehmen die Argumente des neuen Programms als Argumentliste variabler Länge in die Funktion selbst auf. Das Ende der Argumente wird durch einen(char *)NULLangezeigt Streit. Sie sollten immer die Typumwandlung angeben, daNULLdarf eine ganzzahlige Konstante sein, und Konvertierungen von Standardargumenten beim Aufrufen einer Variadic-Funktion konvertieren dies nicht in einen Zeiger. -
Die Aufrufe mit
eim Namen nehmen Sie ein zusätzliches Argument (oder Argumente in derlFall), um die Umgebung des neuen Programms bereitzustellen; andernfalls erbt das Programm die Umgebung des aktuellen Prozesses. Dieser wird auf die gleiche Weise bereitgestellt wie derargvarray:ein Array fürexecve(), separate Argumente fürexecle(). -
Die Aufrufe mit
pin der Namenssuche diePATHUmgebungsvariable, um das Programm zu finden, wenn es kein Verzeichnis enthält (d. h. es enthält keinen/Charakter). Andernfalls wird der Programmname immer als Pfad zur ausführbaren Datei behandelt. -
FreeBSD 5.2 hat eine weitere Variante hinzugefügt:
execvP(mit GroßbuchstabenP). Das ist wieexecvp(), aber anstatt den Suchpfad vonPATHzu erhalten Umgebungsvariable, es ist ein expliziter Parameter für die Funktion:
int execvP(const char *file, const char *search_path, char *const argv[]);
Verwenden Sie man exec und lesen Sie:
The execv(), execvp(), and execvpe() functions provide an array of pointers to
null-terminated strings that represent the argument list available to the new program.
The first argument, by convention, should point to the filename associated with the file
being executed. The array of pointers must be terminated by a NULL pointer.
execv
int execv(const char *path, char *const argv[]);
Sie übergeben also ein Array als Parameter
int execle(const char *path, const char *arg,
..., char * const envp[]);
Fast genauso, aber nicht als Array, sondern als Liste von Werten (Strings), gefolgt von einem Array, das die Umgebung bezeichnet.
Hier:
int execvp(const char *file, char *const argv[]);
Sie rufen eine Datei ohne Pfad auf, also erwartet sie, dass Sie bereits im richtigen path sind bevor Sie anrufen.
Zu guter Letzt:
int execve(const char *filename, char *const argv[],
char *const envp[]);
Ähnlich dem vorherigen, aber jetzt haben Sie zwei Arrays für Argumente und Umgebungsvariablen.
Da alle diese Funktionen zur exec()-Familie gehören, lassen Sie mich differentiate gemäß extra characters mit den Bedeutungen,
1.execve ():
p :nicht vorhanden => Name des auszuführenden Programms wird aus pathname genommen
v :present => Argument wird als array übergeben
e :present => Umgebung wird von envp argument übernommen
2.execDatei ():
p :nicht vorhanden => Name des auszuführenden Programms wird aus pathname genommen
l :present => Argument wird als list übergeben
e :present => Umgebung wird von envp argument übernommen
3.execlp ():
p :present => Name des auszuführenden Programms wird aus filename genommen angegeben oder das System wird search for program file in PATH Variable.
l :present => Argument wird als list übergeben
e :nicht vorhanden => Umgebung wird von caller's environ übernommen
4.execvp ():
p :present => Name des auszuführenden Programms wird aus filename genommen angegeben oder das System wird search for program file in PATH Variable.
v :present => Argument wird als array übergeben
e :nicht vorhanden => Umgebung wird von caller's environ übernommen
5.execv ():
p :nicht vorhanden => Name des auszuführenden Programms wird aus pathname genommen
v :present => Argument wird als array übergeben
e :nicht vorhanden => Umgebung wird von caller's environ übernommen
6.execl ():
p :nicht vorhanden => Name des auszuführenden Programms wird aus pathname genommen
l :present => Argument wird als list übergeben
e :nicht vorhanden => Umgebung wird von caller's environ genommen