Utiliser la fonction fork en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction fork pour créer un nouveau processus en C
  2. Utiliser une des fonctions exec pour exécuter un nouveau programme dans le processus enfant en C
Utiliser la fonction fork en C

Cet article explique plusieurs méthodes d’utilisation de la fonction fork en C.

Utiliser la fonction fork pour créer un nouveau processus en C

La fonction fork est utilisée pour créer un nouveau processus représentant la duplication du processus de l’appelant. Notez que le processus appelant est traditionnellement appelé processus parent et un processus nouvellement créé - un processus enfant. Bien que nous ayons mentionné ci-dessus que le processus enfant est un double du processus parent, il existe certaines différences, comme le fait que le processus enfant a son propre PID unique (tous les détails sur les différences sont énumérés dans le manuel de fork page).

Dans l’exemple suivant, nous mettons en œuvre un scénario simple dans lequel fork est utilisée pour exécuter deux processus simultanément. La première déclaration if vérifie si un code d’erreur est renvoyé et ne continue que si le fork a réussi. L’instruction if suivante montre comment structurer le code à exécuter par les processus concurrents.

L’appel fork est un peu unique comparé à d’autres fonctions car il retourne deux fois en cas de succès - dans le processus parent et dans le processus enfant - renvoyant le PID du processus enfant dans le parent et la valeur 0 dans le fils. Notez que nous spécifions les conditions de la boucle en conséquence pour distinguer les différents chemins de code des processus.

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

Production :

printed from parent process - 8485
printed from child process - 8486

Utiliser une des fonctions exec pour exécuter un nouveau programme dans le processus enfant en C

L’un des cas les plus courants d’utilisation de la fonction fork est l’exécution d’un nouveau programme dans le processus enfant, ce qui peut être réalisé en ajoutant une des fonctions exec au mélange. Dans ce cas, nous avons implémenté une fonction séparée appelée spawnChild qui crée un nouveau processus et appelle ensuite execvp pour exécuter le programme donné. Nous avons choisi un programme en ligne de commande largement disponible - top pour l’exécuter dans le processus enfant. Notez que le processus parent peut choisir d’attendre les changements d’état du processus fils en utilisant waitpid.

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

Production :

printed from child process - 8486
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