Fork()
Discutez d'informatique ici !
-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 18:42
-
par Rockleader » 13 Avr 2014, 18:56
Dernier exo d'entrainement avant le partiel de demain

après ça je ne vous embête plus promis !

Voilà un programme
- Code: Tout sélectionner
int main(void)
{
int i=0;
fork();
i++;
printf("%d\n",i);
return 0;
}
La première question me demande ce qu'il affiche
Il affiche donc
1
1
Le processus père et fils vont faire la même chose. Mais j'ai une question comment on sait sur quoi porte le fork; là le programme est simple donc on le devine, mais si c'était plus compliqué ...
Numéro 2; on modifie le programme pour avoir ceci et on pose la même question
- Code: Tout sélectionner
int main(void)
{
int i=0;
fork(); fork();
i++;
printf("%d\n",i);
return 0;
}
Cela nous affichera donc
1
1
1
1
(j'ai testé) mais je vous avouerais qu'au début je pensais plutôt que cela n'en afficherait que 3 et non 4. Pourriez vous m'expliquez ce résultat ?
Numéro 3. Combien de processus sont créés si lon fait n appels à la fonction fork?
Si j'en crois les deux exécution précédentes, on aura n^2 -1 processus crée ?
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !
-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 18:42
-
par Rockleader » 13 Avr 2014, 19:13
Au final si on ne veut pas que le fork soit une copie de tout le programme appelant on utilise le retour du fork; 0 si c'est le fils et du coup on peut personnaliser le code c'est bien cela ?
Du coup je comprends un peu mieux l'exemple de tout à l'heure
Sans fork
Appelant -> 1
1 fork
Appelant (pere) -> 1
fils -> 1
2 fork
Appelant (pere) -> 1
Apppelant (fils) -> 1
Duplication avec le grand père
Appelant (grand père) --> Appelant pere + Appelant fils --> 1 et 1
Je pense avoir compris mais je saurais pas l'expliquer de façon très claire =)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !
-
joel76
- Membre Relatif
- Messages: 230
- Enregistré le: 11 Fév 2013, 15:31
-
par joel76 » 13 Avr 2014, 19:32
Il me semble que tu dois tester le retour de fork pour savoir si tu es dans le père ou le fils.
Les codes sont recopiés, donc, dans chaque nouveau processus créé, i est à 0, donc après incrémentation il devient égal à 1.
-
fatal_error
- Membre Légendaire
- Messages: 6610
- Enregistré le: 22 Nov 2007, 12:00
-
par fatal_error » 13 Avr 2014, 22:07
hello,
pour répondre à numéro 2:
- Code: Tout sélectionner
int main(void)
{
int i=0;
/*---->*/fork();
=>crée un nouveau processus:
on a donc p1, p2 à la première instruction fork.
Puis p1 exécute la deuxième instruction fork et crèes donc un nouveau processus p3
de même p2 exécute sa deuxième instruction fork et crèes p4
nous avons donc p1,..,p4 qui sont à l'instruction i++;
les données étant duppliquées, p1,p4 ont chacun leur propre données, et donc chaque le i de p1 est pas le même que le i de p2.
La réponse numéro 3 est somme toute assez facile si tu comprends numéro 2.
la vie est une fête

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 11 invités