Maison > développement back-end > C++ > En langage C, quelle est la différence entre fork() et exec() ?

En langage C, quelle est la différence entre fork() et exec() ?

王林
Libérer: 2023-09-13 11:01:02
avant
1454 Les gens l'ont consulté

En langage C, quelle est la différence entre fork() et exec() ?

Ici, nous verrons l'effet des appels système fork() et exec() en langage C. fork est utilisé pour créer un nouveau processus en copiant le processus appelant. Le nouveau processus est un processus enfant. Veuillez vous référer aux propriétés suivantes.

  • Le processus enfant a son propre identifiant de processus unique.
  • L'ID de processus parent du processus enfant est le même que l'ID de processus du processus appelant.
  • Le processus enfant n'hérite pas des verrous mémoire et des sémaphores du processus parent.

fork() renvoie le PID du processus enfant. Si la valeur est différente de zéro, c'est l'ID du processus parent, si la valeur est 0, c'est l'ID du processus enfant.

L'appel système exec() est utilisé pour remplacer l'image de processus actuelle par une nouvelle image de processus. Il charge le programme dans l'espace actuel et l'exécute à partir du point d'entrée.

Donc, la principale différence entre fork() et exec() est que fork() démarre une nouvelle copie du processus identique au processus principal. exec() remplace l'image de processus actuelle par une nouvelle image de processus, et le processus parent et le processus enfant sont exécutés en même temps.

Exemple

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>
int main() {
   pid_t process_id;
   int return_val = 1;
   int state;
   process_id = fork();
   if (process_id == -1) { //when process id is negative, there is an error, unable to fork
      printf("can&#39;t fork, error occured</p><p>");
         exit(EXIT_FAILURE);
   } else if (process_id == 0) { //the child process is created
      printf("The child process is (%u)</p><p>",getpid());
         char * argv_list[] = {"ls","-lart","/home",NULL};
      execv("ls",argv_list); // the execv() only return if error occured.
      exit(0);
   } else { //for the parent process
      printf("The parent process is (%u)</p><p>",getppid());
      if (waitpid(process_id, &state, 0) > 0) { //wait untill the process change its state
         if (WIFEXITED(state) && !WEXITSTATUS(state))
            printf("program is executed successfully</p><p>");
         else if (WIFEXITED(state) && WEXITSTATUS(state)) {
            if (WEXITSTATUS(state) == 127) {
               printf("Execution failed</p><p>");
            } else
               printf("program terminated with non-zero status</p><p>");
         } else
            printf("program didn&#39;t terminate normally</p><p>");
      }
      else {
         printf("waitpid() function failed</p><p>");
      }
      exit(0);
   }
   return 0;
}
Copier après la connexion

Sortie

The parent process is (8627)
The child process is (8756)
program is executed successfully
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:tutorialspoint.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal