GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ist der Unterschied zwischen den Funktionen der exec-Familie von Systemaufrufen wie exec und execve?

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 den argv[] anzugeben Array des neuen Programms. Das Ende der Argumente wird durch ein Array-Element angezeigt, das NULL 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, da NULL 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 der l 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 der argv array:ein Array für execve() , separate Argumente für execle() .

  • Die Aufrufe mit p in der Namenssuche die PATH 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ßbuchstaben P ). Das ist wie execvp() , aber anstatt den Suchpfad von PATH 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


Linux
  1. Was ist der Unterschied zwischen strtok_r und strtok_s in C?

  2. Was ist der Unterschied zwischen adduser und useradd?

  3. Was ist der Unterschied zwischen procfs und sysfs?

  4. Was ist der Unterschied zwischen ls und l?

  5. Was ist der Unterschied zwischen wahrscheinlichen und unwahrscheinlichen Aufrufen im Kernel?

Was ist der Unterschied zwischen Linux und Unix?

Was ist der Unterschied zwischen Login- und Non-Login-Shell

Was ist ein Hypervisor? Was ist der Unterschied zwischen Typ 1 und 2?

Was ist der Unterschied zwischen Curl und Wget?

Was sind Linux-Systemaufrufe und Bibliotheksfunktionen?

Was ist der Unterschied zwischen Systemaufruf und Bibliotheksaufruf?