Maison  >  Article  >  développement back-end  >  Quelle est la différence entre fork() et exec() en C ? Une comparaison simple entre fork() et exec()

Quelle est la différence entre fork() et exec() en C ? Une comparaison simple entre fork() et exec()

青灯夜游
青灯夜游original
2019-04-01 15:02:006031parcourir

Chaque application (programme) est exécutée via un processus, qui est une instance de programme en cours d'exécution. Les processus sont créés via différents appels système, les plus populaires sont fork() et exec(), alors quelle est la différence entre eux ? L'article suivant vous présentera la différence entre fork() et exec(), j'espère qu'il vous sera utile.

Quelle est la différence entre fork() et exec() en C ? Une comparaison simple entre fork() et exec()

fork() en langage C

pid_t pid = fork();

fork() appelle le processus en copiant Pour créer un nouveau processus, un nouveau PID est généré et le nouveau processus (appelé processus enfant) est une copie exacte du processus appelant (appelé processus parent). Les deux processus sont presque identiques, à l'exception des éléments suivants : 1. Le processus enfant possède son propre ID de processus unique et ce PID ne correspond à l'ID d'aucun groupe de processus existant.

2. L'ID du processus parent du processus enfant est le même que l'ID du processus appelant.

3. L'enfant n'hérite pas du verrouillage de la mémoire et du réglage du sémaphore de son parent.

4. L'enfant n'hérite pas des opérations d'E/S asynchrones inachevées de son parent, ni d'un contexte d'E/S asynchrone de son parent.

La valeur de retour de fork()

fork() n'accepte aucun paramètre et renvoie une valeur entière. Ci-dessous se trouvent les différentes valeurs renvoyées par fork().

● Valeur négative : échec de la création du processus enfant.

● Zéro : retour au processus enfant nouvellement créé.

●Valeur positive : Retour au parent ou à l'appelant. Cette valeur contient l'ID de processus du processus enfant nouvellement créé.

Remarque : une fois réussi, le PID du processus enfant sera renvoyé dans le processus parent et 0 sera renvoyé dans le processus enfant. En cas d'échec, -1 est renvoyé dans le processus parent, le processus enfant n'est pas créé et errno est défini de manière appropriée.

La série de fonctions exec()exec() en langage C remplace l'image de processus actuelle par une nouvelle image de processus. Il charge le programme dans l'espace de processus actuel et l'exécute à partir du point d'entrée.

Exemple : Nous avons implémenté execv() dans le programme C ci-dessous, la série exec() se compose des fonctions suivantes,

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);

fork() et La différence entre exec()1. fork() crée et démarre un nouveau processus, qui est une copie du processus qui l'a appelé. Les deux processus sont exactement les mêmes ; exec() Remplacez ensuite l'image de processus actuelle par une autre image de processus (différente), et le "segment de données", le "segment de pile" et le "segment de code" du processus actuel sont réécrits par le nouveau programme.

2. Fork() crée un nouveau processus et génère un nouveau PID, de sorte que le processus enfant a son propre ID de processus. exec démarre un nouveau programme et remplace le processus d'origine, donc le nouveau programme gardera inchangé l'ID du processus appelant exec(), c'est-à-dire que le PID du nouveau processus exécuté par exec ne changera pas et est le même que le processus appeler la fonction exec.

3. Les descripteurs de fichiers ouverts par le processus parent avant fork() sont également ouverts dans le processus enfant et pointent vers la même entrée de table de fichiers. Cependant, les descripteurs ouverts avant d'appeler exec() continueront à être ouverts.

Tutoriels vidéo associés recommandés : "

Tutoriel du langage C

" Ce qui précède est l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'apprentissage de chacun. Pour un contenu plus passionnant, vous pouvez prêter attention aux colonnes de didacticiels pertinentes du site Web PHP chinois ! ! !

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:
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