J'ai trouvé ce code dans geeks4geeks et je n'arrive pas à le comprendre correctement:
#include<stdio.h> int main() { for(int i=0;i<5;i++) // loop will run n times (n=5) { pid_t c=fork(); if(c == 0) { printf("[son] pid %d from [parent] pid %d\n",getpid(),getppid()); exit(0); } } for(int i=0;i<5;i++) // loop will run n times (n=5) wait(NULL); }
Ce code crée 5 processus à partir d'un processus père et imprime un message de chaque enfant.Ma question est la suivante: puisque nous n'avons utilisé aucune restriction pour c, le deuxième fork n'est-il pas par exemple exécuté par le père et le premier processus enfant? Isolation de la fourche dans le code du père Comment ce code ne crée-t-il pas 2 ^ 5 processus enfants? La boucle for empêche-t-elle cela de se produire?
3 Réponses :
fork()
renvoie 0 dans le processus enfant, tandis que dans le processus parent, il renvoie le PID de l'enfant. Puisque le c
a une valeur de 0 dans l'enfant, if(c == 0)
évaluera à vrai, l'enfant exécutera l'instruction printf
, puis quittera. Il n'atteindra jamais l'instruction d'évaluation de la boucle.
Les processus enfants n'appellent pas fork
car ils se terminent avant que cela ne se produise:
for(int i=0;i<5;i++) { pid_t c=fork(); if(c == 0) // fork returns 0 to the child process so it enters "if" block { printf("[son] pid %d from [parent] pid %d\n",getpid(),getppid()); // child exits exit(0); } }
Si le bloc if
ne contenait pas de exit
alors yes, chaque enfant reviendrait en haut de la boucle et ferait potentiellement à nouveau un fork
. Mais comme chaque enfant quitte juste après l'impression, seul le processus parent initial appelle fork
, vous ne créez donc que 5 processus.
Dans ce programme, ils utilisent exit (0), de sorte que le processus enfant se termine après sa création.
Vos enfants
exit
juste après avoir été créés, comment peuvent-ils exécuterfork
?La chose clé à noter est que la valeur de retour pour
fork()
dans le processus enfant est 0 et dans le processus parent est le pid de l'enfant. Ainsi, dans le processus enfant, le test if est vrai, et l'instruction d'impression est exécutée et le processus se termine. Si le processus parent, le test if est faux et la boucle continue et fourche un autre processus enfant.Ce n'est pas un «fils», c'est un «enfant». Ce n'est pas un «père», c'est un «parent». Les processus sont sans genre.