Bonjour,
Exercice
soit le programme C suivant
fork(); if (fork()) fork;
fork(); if (fork()) fork;
Combien de processus sont crées à l'exécution du programme(on supposera qu'aucun appel n'échoue).?
est ce que le résultat 36 ou bien plus de 100 ????
Version imprimable
Bonjour,
Exercice
soit le programme C suivant
fork(); if (fork()) fork;
fork(); if (fork()) fork;
Combien de processus sont crées à l'exécution du programme(on supposera qu'aucun appel n'échoue).?
est ce que le résultat 36 ou bien plus de 100 ????
C'est un problème d'algorithmique pure :Code:
1
2
3
4
5
6
7
8
9 fork(); if (fork()) fork; fork(); if (fork()) fork;
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
En 1, tu as maintenant 2 processus.Code:
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 */
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.
Bonjour,
euh... oui mais c'est lui qui l'a donnée, ladite réponse. Non ?Citation:
(non, je ne vais pas te donner la réponse)
Je ne comprends pas ce que tu veux dire...Citation:
Si if(fork()==0) c.a.d il est bien crée le nombre 2*2*2*2*2*2=64
Si if(fork()==0) c.a.d il n'est pas crée le nombre 2*2*3/2*2*2*3/2=36
Donc sur tout ton code :Code:
1
2
3
4
5
6
7
8 /* 1 processus ici */ if ( fork() ) /* l'appel à fork() duplique le processus, donc on a 2 processus après exécution de cette ligne */ { /* MAIS, sur les 2 processus existant, 1 seul, le père, exécute le code qui est dans ce bloc */ /* 2 processus en tout ici */ fork(); /* le père est encore dupliqué, mais le fils n'exécute pas ce code, donc le fils n'est pas dupliqué */ /* 3 processus en tout ici */ } /* Donc 3 processus au final */
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 /* 1 processus */ fork(); /* 2 processus */ if (fork()) fork(); /* 6 processus */ fork(); /* 12 processus */ if (fork()) fork; /* 36 processus */
Ha ben si, finalement, tu as donné la réponse.
Mon probleme pour qoui le 3eme fork() le père est encore dupliqué, mais le fils n'exécute pas ce code, donc le fils n'est pas dupliqué
j'ai pas compris sa
0 est-il vrai ou faux, selon toi?
1268 est-il vrai ou faux, selon toi?
o c.a.d vrai est le fils bien cree
0 et 1286 ont une vérité logique opposée. Donc en sortie de ton "if", seule la moitié des processus donneront un nouveau fils.