Fork()

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

fork()

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 l’on 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 !



Avatar de l’utilisateur
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.

Avatar de l’utilisateur
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 :)

Retourner vers ϟ Informatique

Qui est en ligne

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

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite