Fig 1 : Workflow de base de fork()
Dans cet article, je vais vous montrer comment utiliser l'appel système fork() pour créer des processus enfants en C. Alors, commençons.
fork() Syntaxe et valeur de retour :
La syntaxe de la fonction système fork() est la suivante :
pid_t fork(void);La fonction système fork() n'accepte aucun argument. Il renvoie un entier du type pid_t.
En cas de succès, fork() renvoie le PID du processus fils supérieur à 0. Dans le processus enfant, la valeur de retour est 0. Si fork() échoue, il renvoie -1.
Exemple simple de fork() :
Un exemple simple de fork() est donné ci-dessous :
#inclure#inclure
#inclure
#inclure
#inclure
int main(void)
pid_t pid = fourche();
if(pid == 0)
printf("Enfant => PPID : %d PID : %d\n", getppid(), getpid());
exit(EXIT_SUCCESS);
else if(pid > 0)
printf("Parent => PID : %d\n", getpid());
printf("En attente de la fin du processus enfant.\n");
attendre(NULL);
printf("Processus enfant terminé.\n");
autre
printf("Impossible de créer un processus enfant.\n");
renvoie EXIT_SUCCESS ;
Ici, j'ai utilisé fork() pour créer un processus enfant à partir du processus principal/parent. Ensuite, j'ai imprimé le PID (Process ID) et le PPID (Parent Process ID) du processus enfant et parent. Sur le processus parent wait(NULL) est utilisé pour attendre la fin du processus enfant. Sur le processus enfant, exit() est utilisé pour terminer le processus enfant. Comme vous pouvez le voir, le PID du processus parent est le PPID du processus enfant. Ainsi, le processus enfant 24738 appartient au processus parent 24731.
Vous pouvez également utiliser des fonctions pour rendre votre programme plus modulaire. Ici, j'ai utilisé processusTâche() et parentTâche() fonctions pour les processus fils et parents respectivement. Voici comment fork() est réellement utilisé.
#inclure#inclure
#inclure
#inclure
#inclure
void childTask()
printf("Bonjour tout le monde\n");
void parentTask()
printf("Tâche principale.\n");
int main(void)
pid_t pid = fourche();
if(pid == 0)
enfantTâche();
exit(EXIT_SUCCESS);
else if(pid > 0)
attendre(NULL);
parentTask();
autre
printf("Impossible de créer un processus enfant.");
renvoie EXIT_SUCCESS ;
La sortie du programme ci-dessus :
Exécution de plusieurs processus enfants à l'aide de fork() et de Loop :
Vous pouvez également utiliser loop pour créer autant de processus enfants que nécessaire. Dans l'exemple ci-dessous, j'ai créé 5 processus enfants en utilisant la boucle for. J'ai également imprimé le PID et le PPID des processus enfants.
#inclure#inclure
#inclure
#inclure
#inclure
int main(void)
for(int i = 1; je <= 5; i++)
pid_t pid = fourche();
if(pid == 0)
printf("Processus enfant => PPID=%d, PID=%d\n", getppid(), getpid());
sortie(0);
autre
printf("Processus parent => PID=%d\n", getpid());
printf("En attente de la fin des processus enfants… \n");
attendre(NULL);
printf("processus enfant terminé.\n");
renvoie EXIT_SUCCESS ;
Comme vous pouvez le voir, l'ID du processus parent est le même dans tous les processus enfants. Donc, ils appartiennent tous au même parent. Ils s'exécutent également de manière linéaire. L'un après l'autre. Le contrôle des processus enfants est une tâche sophistiquée. Si vous en apprenez plus sur la programmation système Linux et son fonctionnement, vous pourrez contrôler le flux de ces processus comme bon vous semble.
Exemple réel :
Différents calculs mathématiques complexes tels que la génération de hachage md5, sha256, etc. nécessitent beaucoup de puissance de traitement. Au lieu de calculer des choses comme ça dans le même processus que le programme principal, vous pouvez simplement calculer le hachage sur un processus enfant et renvoyer le hachage au processus principal.
Dans l'exemple suivant, j'ai généré un code PIN à 4 chiffres dans un processus enfant et l'ai envoyé au processus parent, le programme principal. Ensuite, j'ai imprimé le code PIN à partir de là.
#inclure#inclure
#inclure
#inclure
#inclure
int getPIN()
// utilise PPID et PID comme germe
srand(getpid() + getppid());
int secret = 1000 + rand() % 9000;
retour secret;
int main(void)
int fd[2];
tuyau (fd);
pid_t pid = fourche();
si(pid > 0)
fermer(0) ;
fermer(fd[1]);
dup(fd[0]);
int secretNumber;
size_t readBytes = read(fd[0], &secretNumber, sizeof(secretNumber));
printf("En attente du code PIN… \n");
attendre(NULL);
printf("Octets lus : %ld\n", readBytes);
printf("PIN : %d\n", secretNumber);
else if(pid == 0)
fermer (1) ;
fermer(fd[0]);
dup(fd[1]);
int secret = getPIN();
write(fd[1], &secret, sizeof(secret));
exit(EXIT_SUCCESS);
renvoie EXIT_SUCCESS ;
Comme vous pouvez le voir, chaque fois que je lance le programme, je reçois un code PIN à 4 chiffres différent.
Donc, c'est essentiellement comment vous utilisez l'appel système fork () sous Linux. Merci d'avoir lu cet article.