Verwendung der fork-Funktion in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion fork, um einen neuen Prozess in C zu erstellen
  2. Eine der exec-Funktionen verwenden, um ein neues Programm im Kindprozess in C auszuführen
Verwendung der fork-Funktion in C

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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C Process