Linux Exec -Systemanruf

Linux Exec -Systemanruf
Mit dem EXEC -Systemaufruf wird eine Datei ausgeführt, die sich in einem aktiven Prozess befindet. Wenn Exec genannt wird, wird die vorherige ausführbare Datei ersetzt und eine neue Datei ausgeführt.

Genauer. Der gesamte Inhalt des Prozesses wird durch ein neues Programm ersetzt.

Das Segment von Benutzerdaten, das den Systemexec () -Systemanruf ausführt, wird durch die Datendatei ersetzt, deren Name im Argument beim Aufrufen von exec () angegeben ist.

Das neue Programm wird in denselben Prozessraum geladen. Der aktuelle Prozess wird gerade in einen neuen Prozess verwandelt, und daher wird die Prozess -ID -PID nicht geändert. Dies liegt daran.

Wenn der aktuell ausgeführte Prozess mehr als einen Thread enthält, werden alle Threads beendet und das neue Prozessbild wird geladen und dann ausgeführt. Es gibt keine Destruktor -Funktionen, die Fäden des aktuellen Prozesses beenden.

Die PID des Prozesses wird nicht geändert, sondern die Daten, Code, Stapel, Haufen usw. des Prozesses werden geändert und durch die von neu beladenem Prozess ersetzt. Der neue Prozess wird aus dem Einstiegspunkt ausgeführt.

Eec System Call ist eine Sammlung von Funktionen und in der C -Programmiersprache, die Standardnamen für diese Funktionen sind wie folgt:

  1. Execl
  2. Führung
  3. Execlp
  4. execv
  5. ausführen
  6. execvp


Hier sollte beachtet werden, dass diese Funktionen die gleiche Basis haben Geschäftsführer gefolgt von einem oder mehreren Buchstaben. Diese werden unten erklärt:

E: Es ist eine Reihe von Zeigern, die auf Umgebungsvariablen verweist und explizit an den neu geladenen Prozess übergeben wird.

L: L ist für die Befehlszeilenargumente übergeben eine Liste an die Funktion

P: P ist die Pfadumgebungsvariable, mit der die Datei als Argument in den Prozess geladen werden soll.

v: V ist für die Befehlszeilenargumente. Diese werden als eine Reihe von Zeigern an die Funktion übergeben.

Warum Exec verwendet wird?

Exec wird verwendet, wenn der Benutzer eine neue Datei oder ein neues Programm im selben Prozess starten möchte.

Innere Arbeit von Exec

Betrachten Sie die folgenden Punkte, um die Arbeit von Exec zu verstehen:

  1. Das aktuelle Prozessbild wird mit einem neuen Prozessbild überschrieben.
  2. Neues Prozessbild ist das, das Sie als Exec -Argument bestanden haben
  3. Der aktuell laufende Prozess wird beendet
  4. Neues Prozessbild verfügt über die gleiche Prozess -ID, die gleiche Umgebung und denselben Dateideskriptor (da der Prozess nicht ersetzt wird, wird das Prozessbild ersetzt)
  5. Die CPU -STAT und der virtuelle Speicher sind betroffen. Die virtuelle Speicherzuordnung des aktuellen Prozessbildes wird durch virtuelles Speicher des neuen Prozessbildes ersetzt.

Syntaxe von Exec -Familienfunktionen:

Im Folgenden finden Sie die Syntaxen für jede Funktion von Exec:

int execl (const char* path, const char* arg,…)
int execlp (const char* Datei, const char* arg,…)
int execle (const char* path, const char* arg,…, char* const envp [])
int execv (const char* path, const char* argv [])
int execvp (const char* Datei, const char* argv [])
int execvpe (const char* Datei, const char* argv [], char* const envp [])

Beschreibung:

Der Rückgabetyp dieser Funktionen ist int int. Wenn das Prozessbild erfolgreich ersetzt wird. Wenn jedoch Fehler -1 zurückgegeben werden. Wenn ein Fehler aufgetreten ist, Errno ist gesetzt.

In der Syntax:

  1. Weg wird verwendet, um den vollständigen Pfadnamen der Datei anzugeben, die ausgeführt werden soll.
  1. arg ist das Argument verabschiedet. Es ist tatsächlich der Name der Datei, die im Prozess ausgeführt wird. In den meisten Fällen ist der Wert von Arg und Pfad gleich.
  1. const char* arg In Funktionen wird execl (), execlp () und execle () als arg0, arg1, arg2,…, argn angesehen. Es ist im Grunde genommen eine Liste von Zeigern auf Null -Kündigungsketten. Hier zeigt das erste Argument auf den Dateinamen, der wie in Punkt 2 beschrieben ausgeführt wird.
  1. Envp ist ein Array, das Zeiger enthält, die auf die Umgebungsvariablen hinweisen.
  1. Datei wird verwendet, um den Pfadnamen anzugeben, der den Pfad der neuen Prozessbilddatei identifiziert.
  1. Die Funktionen des Execs rufen das Ende mit e werden verwendet, um die Umgebung für das neue Prozessbild zu ändern. Diese Funktionen passieren die Liste der Umgebungseinstellungen mit dem Argument Envp. Dieses Argument ist eine Reihe von Zeichen, die auf die NULL -Kündigungsfolge hinweisen und die Umgebungsvariable definieren.

Um die Funktionen der EXEC -Familie zu verwenden, müssen Sie die folgende Header -Datei in Ihr C -Programm aufnehmen:

#enthalten

Beispiel 1: Verwenden des EXEC -Systemaufrufs im C -Programm

Betrachten Sie das folgende Beispiel, in dem wir Eec -Systemaufruf in C -Programmierung in Linux, Ubuntu, verwendet haben: Wir haben hier zwei C -Dateien Beispiele.C und Hallo.C:

Beispiel.C

CODE:

#enthalten
#enthalten
#enthalten
int main (int argc, char *argv [])

printf ("PID des Beispiels.c = %d \ n ", getPid ());
char *args [] = "hello", "c", "programmieren", null;
execv ("./Hallo ", Args);
printf ("zurück zum Beispiel.C");
Rückkehr 0;

Hallo.C

CODE:

#enthalten
#enthalten
#enthalten
int main (int argc, char *argv [])

printf ("Wir sind in Hallo.c \ n ");
printf ("pid von Hallo.c = %d \ n ", getPid ());
Rückkehr 0;

AUSGANG:

PID des Beispiels.C = 4733
Wir sind in Hallo.C
Pid von Hallo.C = 4733

Im obigen Beispiel haben wir ein Beispiel.c Datei und Hallo.c Datei. Im Beispiel .c Datei Zunächst haben wir die ID des aktuellen Prozesses gedruckt (Beispieldateibeispiel.C läuft im aktuellen Prozess). Dann haben wir in der nächsten Zeile eine Reihe von Charakterzeigern erstellt. Das letzte Element dieses Arrays sollte als Abschlusspunkt null sein.

Dann haben wir den Funktion execv () verwendet, der den Dateinamen und das Zeichenzeiger -Array als Argument nimmt. Es sollte hier angemerkt werden, dass wir verwendet haben ./ Mit dem Namen der Datei gibt es den Pfad der Datei an. Da sich die Datei im Ordner befindet, wo Beispiel.C liegt so, dass es nicht erforderlich ist, den vollständigen Pfad anzugeben.

Wenn execV () -Funktion aufgerufen wird, wird unser Prozessbild nun das Beispiel für Datei ersetzt.c ist nicht im Prozess, sondern die Datei Hallo Hallo.c ist dabei. Es ist ersichtlich, dass die Prozess -ID gleich ist, ob Hallo.C ist Prozessbild oder Beispiel.C ist ein Prozessbild, da der Prozess gleich ist und das Prozessbild nur ersetzt wird.

Dann haben wir hier eine andere Sache zu beachten, nämlich die printf () -Anweisung, nachdem execv () nicht ausgeführt wurde. Dies liegt daran. Die Steuerung kommt nur wieder auf die Aufruffunktion zurück, wenn das Ersetzen des Prozessbildes nicht erfolgreich ist. (Der Rückgabewert ist in diesem Fall -1).

Unterschied zwischen fork () und exec () Systemanrufen:

Der Fork () -Systemaufruf wird verwendet, um eine genaue Kopie eines laufenden Vorgangs zu erstellen, und die erstellte Kopie ist der untergeordnete Prozess und der laufende Prozess ist der übergeordnete Prozess. Während der Systemanruf von Exec () verwendet wird, um ein Prozessbild durch ein neues Prozessbild zu ersetzen. Daher gibt es kein Konzept von Eltern- und Kinderprozessen in exec () Systemanrufe.

In Fork () System Call Die übergeordneten und untergeordneten Prozesse werden gleichzeitig ausgeführt. In Exec () -Systemanruf kehrt die Steuerung jedoch nicht zu dem Ort, an dem die EXEC -Funktion als eher eher genannt wird, den neuen Prozess aus. Das Steuerelement wird nur zurückgeführt, wenn ein Fehler vorliegt.

Beispiel 2: Kombinieren von fork () und exec () Systemanrufen

Betrachten Sie das folgende Beispiel, in dem wir sowohl fork () als auch exec () Systemanrufe im selben Programm verwendet haben:

Beispiel.C

CODE:

#enthalten
#enthalten
#enthalten
int main (int argc, char *argv [])

printf ("PID des Beispiels.c = %d \ n ", getPid ());
pid_t p;
p = fork ();
if (p ==-1)

printf ("Es gibt einen Fehler beim Aufrufen von fork ()");

if (p == 0)

printf ("Wir sind im untergeordneten Prozess \ n");
printf ("Hallo anrufen.c aus dem Kinderprozess \ n ");
char *args [] = "hello", "c", "programmieren", null;
execv ("./Hallo ", Args);

anders

printf ("Wir sind im Elternprozess");

Rückkehr 0;

Hallo.C:

CODE:

#enthalten
#enthalten
#enthalten
int main (int argc, char *argv [])

printf ("Wir sind in Hallo.c \ n ");
printf ("pid von Hallo.c = %d \ n ", getPid ());
Rückkehr 0;

AUSGANG:

PID des Beispiels.C = 4790
Wir sind im Elternprozess
Wir sind im Kinderprozess
Hallo anrufen.C aus dem Kinderprozess
Wir sind in Hallo.C
Pid von Hallo.C = 4791

In diesem Beispiel haben wir Fork () -Systemanruf verwendet. Wenn der Kinderprozess erstellt wird, wird 0 zugewiesen und dann werden wir zum Kinderprozess übergehen. Jetzt wird der Anweisungsblock mit if (p == 0) ausgeführt. Eine Meldung wird angezeigt und wir haben execv () Systemanrufe und das aktuelle Kinderprozessbild verwendet, das Beispiel ist.C wird durch Hallo ersetzt.C. Bevor execv () untergeordnete und übergeordnete Prozesse aufrufen.

Es ist ersichtlich, dass die PID des Beispiels.C und Hallo.C ist jetzt anders. Dies liegt daran.c ist das übergeordnete Prozessbild und Hallo.C ist das Kinderprozessbild.