Bonjour à tous,
J'ai besoin d'aide sur cette exercice
Pièce jointe 166440Pièce jointe 166441
Est ce que la solution est juste????
Version imprimable
Bonjour à tous,
J'ai besoin d'aide sur cette exercice
Pièce jointe 166440Pièce jointe 166441
Est ce que la solution est juste????
Non, c'est complètement faux. Tu ne devrais avoir que 4 processus au final. Réfère-toi à la valeur de retour de fork décrite dans le man.
Bonjour
Désolé imperio, ce n'est absolument pas "complètement faux". Ce serait même en fait "quasiment juste" (je ne comprends d'ailleurs pas ce -1 qu'on lui a mis). A chaque itération, le fils créé à l'itération précédente relance lui-même un fork(). Il y a juste ce "i++" dédoublé dans le cas où le fork() reste dans le père qui met un peu la zone dans les calculs (d'où son erreur où il montre 3 fils F1,F3 et F4 sous son père alors qu'il n'y a que F1 et F3 et F4 qui serait plutôt sous F8) mais on voit très bien ce qui se passe avec ce code
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { int i; for (i=0; i < 4; i++) { printf("pid(%d:%d) - i=%d\n", getppid(), getpid(), i); if (fork() > 0) i++; else { sleep(1); printf("\tfils(%d:%d): %d\n", getppid(), getpid(), i); } } wait(NULL); }
Et son résultat
Le père 17495 donne naissance à 17496 et 17497Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 $ ./fork pid(8486:17495) - i=0 pid(8486:17495) - i=2 fils(17495:17496): 0 pid(17495:17496) - i=1 pid(17495:17496) - i=3 fils(17495:17497): 2 pid(17495:17497) - i=3 fils(17497:17500): 3 fils(17496:17499): 3 fils(17496:17498): 1 pid(1:17498) - i=2 fils(17498:17501): 2 pid(17498:17501) - i=3 fils(17501:17502): 3
Le premier fils de niveau 1 (17496) donne naissance à 17498 et 17499 tandis que le second fils de niveau 1 (17497) donne naissance à 17500
Le premier fils de niveau 2 (17498) donne naissance à 17501 tandis que les deux autres (17499 et 17500) ne donnent plus de fils (pour eux, "i" a dépassé 3)
Le fils de niveau 3 (17501) donne naissance à 17502 et c'est fini. Il y a donc bien 7 fils...
Zut, t'as raison. Il a dû faire la même erreur que moi
En remplaçant 4 par 3 et en améliorant un peu la gestion de l'attente des fils en final (remplacer wait(NULL); par while(wait(NULL) > 0);), voilà ce que ça donne
Le père 17826 donne naissance à 17827 et 17828Code:
1
2
3
4
5
6
7
8
9 $ ./fork pid(8486:17826) - i=0 pid(8486:17826) - i=2 fils(17826:17827): 0 pid(17826:17827) - i=1 fils(17826:17828): 2 fils(17827:17829): 1 pid(17827:17829) - i=2 fils(17829:17830): 2
Le premier fils de niveau 1 (17827) donne naissance à 17829 tandis que le second fils (17828) ne donne rien ("i" a dépassé 3)
Le fils de niveau 2 (17829) donne naissance à 17830 et c'est fini. Il y a donc bien 4 fils... (encore désolé imperio)
Je me suis amusé à tester plusieurs valeurs de "i". Pour i=2, ça donne 1 fils. Pour i=3, ça donne 4 fils. Pour i=4, ça donne 7 fils, pour i=5 ça donne 12 fils, pour i=6 ça en donne 34 et pour i=7 ça en donne 49. Probable qu'il doit y avoir une formule générique qui donne directement le nombre de fils mais je ne suis pas arrivé à la trouver...