Maison > Article > développement back-end > 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.
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.
#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'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't terminate normally</p><p>"); } else { printf("waitpid() function failed</p><p>"); } exit(0); } return 0; }
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!