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

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

王林
王林avant
2023-09-13 11:01:021441parcourir

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

Sortie

The parent process is (8627)
The child process is (8756)
program is executed successfully

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer