Bonjour à tous,
J'ai besoin d'aide sur cette exercice
Est ce que la solution est juste????
Bonjour à tous,
J'ai besoin d'aide sur cette exercice
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 c : Sélectionner tout - Visualiser dans une fenêtre à part
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 17497
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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...
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
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 17828
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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...
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager