Verwendung der fork-Funktion in C
-
Verwenden Sie die Funktion
fork
, um einen neuen Prozess in C zu erstellen -
Eine der
exec
-Funktionen verwenden, um ein neues Programm im Kindprozess in C auszuführen
In diesem Artikel werden verschiedene Methoden zur Verwendung der Funktion fork
in C erklärt.
Verwenden Sie die Funktion fork
, um einen neuen Prozess in C zu erstellen
Die Funktion fork
wird verwendet, um einen neuen Prozess zu erzeugen, der die Vervielfältigung des aufrufenden Prozesses darstellt. Beachten Sie, dass der aufrufende Prozess konventionell als Elternprozess bezeichnet wird und der neu erstellte - als Kindprozess. Obwohl wir oben erwähnt haben, dass der Kindprozess ein Duplikat des Elternprozesses ist, gibt es einige Unterschiede, wie z. B., dass der Kindprozess seine eigene eindeutige PID hat (alle Details über die Unterschiede sind im fork
-Handbuch Seite aufgeführt).
Im folgenden Beispiel implementieren wir ein einfaches Szenario, in dem fork
verwendet wird, um zwei Prozesse gleichzeitig auszuführen. Die erste if
-Anweisung prüft, ob ein Fehlercode zurückgegeben wird und fährt nur fort, wenn der fork
erfolgreich war. Die nächste if
-Anweisung demonstriert, wie man Code strukturiert, der von konkurrierenden Prozessen ausgeführt werden soll.
Der Aufruf von fork
ist im Vergleich zu anderen Funktionen ein wenig einzigartig, da er bei Erfolg zweimal zurückkehrt - im Elternprozess und im Kindprozess - und die PID des Kindprozesses im Elternprozess und den Wert 0
im Kindprozess zurückgibt. Beachten Sie, dass wir die Bedingungen der Schleife entsprechend spezifizieren, um unterschiedliche Codepfade für Prozesse zu unterscheiden.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
int main(void) {
pid_t c_pid = fork();
if (c_pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (c_pid == 0) {
printf("printed from child process - %d\n", getpid());
exit(EXIT_SUCCESS);
} else {
printf("printed from parent process - %d\n", getpid());
wait(NULL);
}
exit(EXIT_SUCCESS);
}
Ausgabe:
printed from parent process - 8485
printed from child process - 8486
Eine der exec
-Funktionen verwenden, um ein neues Programm im Kindprozess in C auszuführen
Einer der häufigsten Fälle für die Verwendung der fork
-Funktion ist die Ausführung eines neuen Programms im Kindprozess, was durch Hinzufügen einer der exec
-Funktionen erreicht werden kann. In diesem Fall haben wir eine separate Funktion namens spawnChild
implementiert, die einen neuen Prozess erzeugt und dann execvp
aufruft, um das angegebene Programm auszuführen. Wir haben ein weit verbreitetes Kommandozeilenprogramm - top
- zur Ausführung im Kindprozess gewählt. Beachten Sie, dass der Elternprozess mit waitpid
auf die Zustandsänderungen des Kindprozesses warten kann.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
pid_t spawnChild(const char* program, char** arg_list) {
pid_t ch_pid = fork();
if (ch_pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (ch_pid == 0) {
execvp(program, arg_list);
perror("execve");
exit(EXIT_FAILURE);
} else {
printf("spawned child with pid - %d\n", ch_pid);
return ch_pid;
}
}
int main(void) {
int ret;
const char* args[] = {"top", NULL, NULL};
pid_t child;
int wstatus;
child = spawnChild("top", args);
if (waitpid(child, &wstatus, WUNTRACED | WCONTINUED) == -1) {
perror("waitpid");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
Ausgabe:
printed from child process - 8486
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook