wait Fonction en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction wait pour attendre un changement d’état dans les processus de l’enfant en C
  2. Utilisez la fonction waitpid pour attendre un changement d’état dans un processus enfant spécifique en C
wait Fonction en C

Cet article présente plusieurs méthodes pour utiliser la fonction wait en C.

Utiliser la fonction wait pour attendre un changement d’état dans les processus de l’enfant en C

La fonction wait est un wrapper pour les appels système compatibles POSIX, défini dans le fichier d’en-tête <sys/wait.h>. La fonction est utilisée pour attendre les changements d’état du programme dans les processus enfants et récupérer les informations correspondantes. La fonction wait est généralement appelée après l’appel système fork qui crée un nouveau processus fils. L’appel wait suspend le programme appelant jusqu’à ce que l’un de ses processus fils se termine.

L’utilisateur doit structurer le code de manière à ce qu’il y ait deux chemins différents pour un processus appelant et le processus fils. Cela se fait généralement avec l’instruction if...else qui évalue la valeur de retour de l’appel de fonction fork. Notez que fork renvoie l’ID du processus fils, un entier positif, dans le processus parent et renvoie 0 dans le processus fils. Fork retournera -1 si l’appel échoue.

#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);
}

Utilisez la fonction waitpid pour attendre un changement d’état dans un processus enfant spécifique en C

La fonction waitpid est une version légèrement améliorée de la fonction wait qui permet d’attendre le processus enfant spécifique et de modifier le comportement de déclenchement du retour. waitpid peut revenir si le processus enfant a été arrêté ou poursuivi, en plus du cas où l’enfant est terminé.

Dans l’exemple suivant, nous appelons la fonction pause du processus enfant, qui se met en veille jusqu’à ce que le signal soit reçu. D’autre part, le processus parent appelle la fonction waitpid et suspend l’exécution jusqu’au retour de l’enfant. Il utilise également les macros WIFEXITED et WIFSIGNALED pour vérifier si l’enfant est terminé normalement ou terminé par le signal, respectivement, puis imprime le message d’état correspondant sur la console.

#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);
}
Auteur: 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

Article connexe - C Process