Während die Funktion exec() verwendet wird, um das aktuell vorhandene Programm durch das neue zu ändern. Diese Ersetzung erfolgt durch Änderungen des Inhalts eines Programms oder einer Datei. Der Unterschied zwischen fork und exec besteht also darin, dass fork einen neuen Prozess aus dem vorhandenen Prozess erstellt und exec verwendet wird, um das vorhandene Programm durch das Erstellen eines neuen zu ersetzen.
Voraussetzungen
Um ein c-Programm auf Ihrem Linux-System auszuführen, müssen wir einige Voraussetzungen darauf installieren. Gehen Sie zum Terminal, indem Sie die Tastenkombination Strg+Alt+T . verwenden. Schreiben Sie nun die folgenden Befehle, um die Manpages zu installieren.
$ sudo apt install manpages-dev
Es werden alle entsprechenden Seiten installiert.
Um ein Programm unter Linux auszuführen, müssen Sie einen Code-Compiler installieren. Das wird verwendet, um den Code zu kompilieren und auszuführen. Zu diesem Zweck werden wir GCC-Repositorys in unserem System installieren.
$ sudo apt install GCC
Codierung mit exec in c
Da wir die Manpages in Linux installiert haben, verwenden wir den folgenden Befehl, um die Beschreibung zu exec . anzuzeigen. Die primäre Beispielsyntax lautet wie folgt:
Syntax
Exec (Pfadname/Datei, argv );Hier haben wir die „unistd“ verwendet.h“-Header, da er alle Informationen zu den Familien der exec-Funktion enthält.
$ man exec
Im oben zitierten Bild können Sie nun die Arten von exec. Dies ist die Familie der Exec-Funktionen. Jeder ist für eine andere Funktion, die der gleichen Basis folgt, „exec“.”
Beispiel: Im weiteren Verlauf beschreiben wir die Funktionalität von exec anhand eines Beispiels. Wir nehmen eine Funktion von exec, um ihre Funktionsweise zu demonstrieren, nämlich „execv.” Zuerst erstellen wir zwei Dateien mit der Erweiterung “.c.” Nach ihrer Erstellung schreiben wir entsprechende Codes hinein und führen sie aus, um das Ergebnis zu sehen.
Betrachten Sie einen Dateinamen „sample4“.c”. Bitte öffnen Sie es und verwenden Sie den folgenden Code. In diesem Code haben wir execv in einer bestimmten unten angegebenen Weise verwendet used.
Ausführung ("./sample4copy”, Argumente);Der erste Teil enthält den neuen Verzeichnispfad und der zweite Teil zeigt das Array arguments als übergebenen Parameter parameter.
Probe4.c
Als erstes haben wir die ID des aktuellen Prozesses gedruckt. Zweitens haben wir ein Zeichenarray mit NULL am Ende für die Beendigung erstellt. Drittens haben wir die Funktion sample4copy aufgerufen.
Sample4copy.cBeim Aufruf der exec-Funktion() wird das Prozessabbild geändert. Das unten zitierte Bild unten zeigt den Code von sample4copy.c.
Hier haben wir nur print-Anweisungen verwendet, um die ID des aktuellen Prozesses zu erhalten.
Die Ausgabe der jeweiligen Codes kann mit den folgenden Befehlen erreicht werden.
$ GCC-o Beispiel4 Beispiel4.c$ GCC -o sample4copy sample4copy.c
$ ./probe4
Wie bereits beschrieben, wird das Wort „GCC“ verwendet, um den Code zu kompilieren, und nach der Kompilierung wird der Code erfolgreich ausgeführt.
Laut Bild ist die PID von sample4.c-Datei wird zuerst so angezeigt, wie sie vor dem exec-Aufruf deklariert wurde. Nachdem die Funktion exec() aufgerufen wurde, werden beide print-Anweisungen der Datei sample4copy.c wird ausgeführt, wobei getpid() verwendet wird, um die ID des Prozesses zu erhalten.
Codieren mit einer Gabel in c
Die Funktion fork() erstellt den Kindprozess aus dem Elternprozess. Es enthält auch zwei Header, einschließlich der darin enthaltenen Fork-Informationen.
Syntax:
Pid_t Gabel(leer);Wir können die Manpage verwenden, um Hilfe bei der Verwendung zu erhalten
$ Mann Gabel
Beispiel: Betrachten Sie nun ein Beispiel, indem Sie eine Datei „sample3“ erstellen.c”. Wir geben den Code in die Datei ein. Laut Code haben wir den Fork-Status auf forkrank gesetzt.
Probe3.c
Wir haben die „if-else“-Anweisung verwendet, um die Bedingung anzuwenden. Hier werden einfache Druckbefehle deklariert, um das Verständnis des fork()-Konzepts zu erleichtern. Forkrank wird zuerst als 0 und dann als -1 . deklariert. Mit einem fork() gibt es jetzt zwei Prozesse, die gleichzeitig arbeiten. Die Ausgabe kann mit dem gleichen Code wie oben im exec-Beispiel erhalten werden.
$ GCC -o Beispiel3.c$./probe3
Die Ausgabe zeigt, dass der untergeordnete Prozess früher ausgeführt wird als der übergeordnete Prozess, als der übergeordnete Prozess wartete. Die Wait-Funktion impliziert, dass sie die Parent-Funktion warten lässt, bis einer der Child-Prozesse beendet wird.
Fork- und Exec-Systemaufrufe gemeinsam
Hier nehmen wir zwei Dateien mit dem Namen "sample1".c“ und „sample2“.c”. Öffnen Sie zunächst die Datei sampl1.c und schreibe den Code, der unten im Bild angehängt ist. Wir haben hier den Systemaufruf fork() verwendet; wenn der untergeordnete Prozess erstellt wird, wird p mit 0 . belegt. Bei Verwendung von exec system-call wird das Beispiel1.c wird ersetzt durch sample2.c.
Probe1.c
Probe2.c
Ähnlich wie in den oben besprochenen Beispielen enthält die Datei sample2 die printf-Anweisungen. In Probe1.c, der erste Druckbefehl wird zuerst ausgeführt, dann wird die fork-Funktion aufgerufen, wenn p== 0, dann wird der Kindteil ausgeführt und sample2.c-Datei wird ausgeführt. Die Ausgabe enthält GCC, um beide Dateien zu kompilieren. Hier Elternprobe1.c id und probe2.c id ist anders, weil sie Elternteil und Kind sind.
Fazit
In diesem Artikel haben wir sowohl fork als auch exec separat und gemeinsam verwendet, um die Verwendung und das Konzept leicht zu verstehen. Ich hoffe, dieses Tutorial enthält genügend Inhalte, die zu einem Zugang zur Eskalation Ihres Wissens führen.