1 2 3 4 5 6 7 8 9
| fork();
if (fork())
fork;
fork();
if (fork())
fork; |
C'est un problème d'algorithmique pure :
Avant le premier appel, tu as 1 processus. Au premier appel, il en créé un autre, tu en as donc 2 ; à chaque appel de fork, tu en auras un de plus
par appelant.
Maintenant, on arrive au if (fork()), qui est extrèmement ma écrit, et proche de l'obfuscation de code (si ton prof me lit, c'est avec plaisir que je lui expliquerai pourquoi s'il le faut). Ca serait déjà un peu mieux avec :
if (fork() != 0), et encore mieux avec
1 2 3 4 5 6 7 8
|
/* Attention, on suppose que fork() ne peut pas echouer, ce qui n'est pas le cas dans la vraie vie */
pid = fork(); /* 1 : on duplique le processus */
if (pid != 0) /* etape 2 : test */
{
fork(); /* 3 : on duplique l'appelant */
}
/* pas de else */ |
En 1, tu as maintenant 2 processus.
Sauf que pid ne vaut pas la même chose pour le père et pour le fils : pid vaut 0 pour le fils, alors que le père se voit retourner le numéro de processus (que l'on appelle pid) du fils.
Donc le code du if, c'est à dire l'étape 3, ne sera exécuté que par le père, qui va se dupliquer à son tour.
A la fin de ces lignes, tu as donc 3 processus
par appelant.
Et comme tu avais 2 processus en arrivant à ce bout de code, tu en as 6 en tout.
Ensuite, tous ces processus appellent fork, et se dupliquent. Donc 12. Et ainsi de suite... (non, je ne vais pas te donner la réponse).
Si tu veux le visualiser, fais un schéma, avec des ronds pour chaque étape, et des flèches pour chaque processus.
Partager