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
v
Nehmen Sie im Namen einen Array-Parameter, um denargv[]
anzugeben Array des neuen Programms. Das Ende der Argumente wird durch ein Array-Element angezeigt, dasNULL
enthält . -
Die Aufrufe mit
l
im 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 *)NULL
angezeigt Streit. Sie sollten immer die Typumwandlung angeben, daNULL
darf eine ganzzahlige Konstante sein, und Konvertierungen von Standardargumenten beim Aufrufen einer Variadic-Funktion konvertieren dies nicht in einen Zeiger. -
Die Aufrufe mit
e
im Namen nehmen Sie ein zusätzliches Argument (oder Argumente in derl
Fall), um die Umgebung des neuen Programms bereitzustellen; andernfalls erbt das Programm die Umgebung des aktuellen Prozesses. Dieser wird auf die gleiche Weise bereitgestellt wie derargv
array:ein Array fürexecve()
, separate Argumente fürexecle()
. -
Die Aufrufe mit
p
in der Namenssuche diePATH
Umgebungsvariable, 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 vonPATH
zu 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