wait Funktion in C

Jinku Hu 12 Oktober 2023
  1. Verwendung der wait-Funktion zum Warten auf Zustandsänderungen in Child-Prozessen in C
  2. Verwenden Sie die Funktion waitpid, um auf eine Zustandsänderung in einem bestimmten Kindprozess in C zu warten
wait Funktion in C

In diesem Artikel werden mehrere Methoden zur Verwendung der Funktion wait in C vorgestellt.

Verwendung der wait-Funktion zum Warten auf Zustandsänderungen in Child-Prozessen in C

Die Funktion wait ist ein Wrapper für einen POSIX-kompatiblen Systemaufruf, der in der Header-Datei <sys/wait.h> definiert ist. Die Funktion wird verwendet, um auf Programmzustandsänderungen in Kindprozessen zu warten und die entsprechenden Informationen abzurufen. wait wird normalerweise nach dem Systemaufruf fork aufgerufen, der einen neuen Kindprozess erzeugt. Der Aufruf von wait hält das aufrufende Programm an, bis einer seiner Kindprozesse beendet ist.

Der Anwender sollte den Code so strukturieren, dass es zwei verschiedene Pfade für einen aufrufenden Prozess und den Kindprozess gibt. Dies wird normalerweise mit der if...else-Anweisung erreicht, die den Rückgabewert des fork-Funktionsaufrufs auswertet. Beachten Sie, dass fork im Elternprozess die ID des Kindprozesses, eine positive Ganzzahl, zurückgibt und im Kindprozess 0 zurückgibt. Wenn der Aufruf fehlschlägt, gibt fork-1 zurück.

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
  pid_t c_pid = fork();

  if (c_pid == -1) {
    perror("fork");
    exit(EXIT_FAILURE);
  }

  if (c_pid == 0) {
    printf("printed from child process %d", getpid());
    exit(EXIT_SUCCESS);
  } else {
    printf("printed from parent process %d\n", getpid());
    wait(NULL);
  }

  exit(EXIT_SUCCESS);
}

Verwenden Sie die Funktion waitpid, um auf eine Zustandsänderung in einem bestimmten Kindprozess in C zu warten

waitpid ist eine leicht erweiterte Version der Funktion wait, die die Möglichkeit bietet, auf einen bestimmten Kindprozess zu warten und das Rückgabeverhalten zu ändern. waitpid kann zusätzlich zu dem Fall, dass der Kindprozess beendet wird, auch zurückgeben, wenn der Kindprozess angehalten oder fortgesetzt wurde.

Im folgenden Beispiel rufen wir die Funktion pause vom Kindprozess auf, der in den Ruhezustand geht, bis das Signal empfangen wird. Auf der anderen Seite ruft der Elternprozess die Funktion waitpid auf und setzt die Ausführung aus, bis der Kindprozess zurückkehrt. Außerdem werden die Makros WIFEXITED und WIFSIGNALED verwendet, um zu prüfen, ob der Kindprozess normal oder durch ein Signal beendet wurde, und dann die entsprechende Statusmeldung auf der Konsole auszugeben.

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
  pid_t child_pid, wtr;
  int wstatus;

  child_pid = fork();
  if (child_pid == -1) {
    perror("fork");
    exit(EXIT_FAILURE);
  }

  if (child_pid == 0) {
    printf("Child PID is %d\n", getpid());
    pause();
    _exit(EXIT_FAILURE);
  } else {
    wtr = waitpid(child_pid, &wstatus, WUNTRACED | WCONTINUED);
    if (wtr == -1) {
      perror("waitpid");
      exit(EXIT_FAILURE);
    }

    if (WIFEXITED(wstatus)) {
      printf("exited, status=%d\n", WEXITSTATUS(wstatus));
    } else if (WIFSIGNALED(wstatus)) {
      printf("killed by signal %d\n", WTERMSIG(wstatus));
    }
  }
  exit(EXIT_SUCCESS);
}
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