-
17/05/2008 - 02h26 NAGHAM
Fonction Fork
j'ai du mal à comprendre la fonction fork,en fait à chaque fois je me trompe dans le nombre de fils qui etaient crés par un processus pere, par exemple main()
int pid;
if fork()!=0
{PID=fork();
sleep(5);}
else
{PID=fork();
sleep(5);}
}
combien de processus engendre l'execusion de ce programma?
ma reponse est 3.
-
17/05/2008 - 07h32 yoda1234
Re : Fonction Fork
Moi ce que j'ai du mal a comprendre c'est ton manque courtoisie:
Rappel de notre charte:
La courtoisie est de rigueur sur ce forum : pour une demande de renseignements bonjour et merci devraient être des automatismes.
Pour la modération. Là où l'ignorance est un bienfait, c'est de la folie d'être sage (Thomas Gray). -
17/05/2008 - 08h23 Faith
Re : Fonction Fork
On va découper le truc pour y voir plus clair:
main() => 1 processus P1 entre ici
int pid;
if fork()!=0 => 1 processus P2 supplémentaire est créé
{ => ici le processus P1 continue
PID=fork(); => Nouveau fork crée P1.1
sleep(5); => le processus P1.1 ET le processus P1 arrivent ici
}
else
{ => ici le processus P2 "commence"
PID=fork(); => Nouveau fork crée P2.1
sleep(5); => le processus P2.1 ET le processus P2 arrivent ici
}
} => les processus P1, P1.1, P2, P2.2 arrivent ici et se terminent Y vois-tu un peu plus clair ?
-
18/05/2008 - 09h03 polo974
Re : Fonction Fork
en fait, il faut lire la doc:
sous unix: man fork()
ailleurs: google man fork()
man fork() ...
Valeur Renvoyée
En cas de succès, le PID du fils est renvoyé au processus parent, et 0 est renvoyé au processus fils. En cas d'échec -1 est renvoyé dans le contexte du parent, aucun processus fils n'est créé, et errno contient le code d'erreur.
...
Tous les processus sortent de fork().
Donc la valeur de retour de la fonction te dit qui tu es:
0: l'enfant
-1: le parent en deuil de son enfant qui n'a pu voir le jour
autre: l'heureux parent de l'enfant prénommé PID
Bref en testant cette valeur, la suite du programme sait qui il est.
En passant pid n'est pas égal à PID (C is case sensitive).
Autre fonction sympa pour se genre de casse tête (qui suis-je à la sortie de la fonction?), voir setjump et longjump...
-
20/05/2008 - 21h11 NAGHAM
Re : Fonction Fork
bonsoir à tout le monde
merci d'avoir pris la peine de me répondre
enfin j'ai bien compris ce que vs venez de m'expliquer, ce programme genere 4 processus P1, P2, P1.1,et enfin P1.2 mais
est ce que le INIT est inclus?
est ce qu'on doit pas avoir l'instruction pid=fork() pour pouvoir créer un processus fils(c'est-à-dire comment lors de l'instruction if fork()!=0 le processus P1 a été crée?) voilà merci d'avance -
20/05/2008 - 21h35 Faith
Re : Fonction Fork
 Envoyé par NAGHAM bonsoir à tout le monde
merci d'avoir pris la peine de me répondre
enfin j'ai bien compris ce que vs venez de m'expliquer, ce programme genere 4 processus P1, P2, P1.1,et enfin P1.2 mais
est ce que le INIT est inclus? P1 est les processus principal. Il y a donc 3 fils en plus du processus "Init".
est ce qu'on doit pas avoir l'instruction pid=fork() pour pouvoir créer un processus fils(c'est-à-dire comment lors de l'instruction if fork()!=0 le processus P1 a été crée?) Bon, il va falloir revoir les bases: n'hésite pas à demander à un camarade un peu d'aide. Je vais essayer de t'expliquer, mais en face à face, c'est plus facile...
la fonction fork, quelle que soit les conditions de son appel, crée un processus fils (en plus du processus actuel).
Lorsque tu écris pid=fork(), tu demandes simplement que soit retourné le résultat de la fonction fork dans la variable pid.
Quand tu écris if (fork() != 0), la fonction fork est appelée, et son retour, au lieu d'être stocké dans une variable, est comparé à 0.
Ce serait la même chose que si il était écrit:
pid=fork();
if (pid != 0) ...
Comprends-tu ?
A noter: le concept de fonction est assez simple. Si tu as eu un soucis pour comprendre le système, c'est qu'il te manque quelques bases.
Sachant que fork est une notion avancée, il faut à tout prix que tu sois à l'aise avec les bases avant de te lancer.
-
20/05/2008 - 21h51 NAGHAM
Re : Fonction Fork
rebonsoir
oui j'ai saisi ce que tu vient de me dire,merci
en fait y-t-il pas des liens ou livres pour que je me debroiulle
enfin ça fait une semaine qu'on est demandé d'ecrire un programme qui engendre une arbre au niveau 3 et malheuresement on n'est pas arrivé , on travaille en groupe
à titre d'indication on travaille sur linux
mercii nfiniment monsieur!
-
21/05/2008 - 08h24 Faith
Re : Fonction Fork
 Envoyé par NAGHAM oui j'ai saisi ce que tu vient de me dire,merci Ok, parfait.
en fait y-t-il pas des liens ou livres pour que je me debroiulle
Si tu cherches "tutoriel fork C" ou "tutorial fork C" tu auras pas mal d'infos... Mais rien ne remplace pour ce genre de concepts un vrai "prof" (ou un ami qui s'y connais)
enfin ça fait une semaine qu'on est demandé d'ecrire un programme qui engendre une arbre au niveau 3 et malheuresement on n'est pas arrivé , on travaille en groupe
Euh... je ne vois pas bien le lien entre arbre niveau 3 et fork...
Mais sur le net on trouve pas mal d'infos sur les arbres, les forks, etc, ça devrait t'aider.
Bon courage !
-
21/05/2008 - 21h59 NAGHAM
Re : Fonction Fork
bonsoir
merci infiniment
gentil de votre part de m'aider
bonne soirée
-
24/05/2008 - 15h52 polo974
Re : Fonction Fork
Si le but est d'avoir un arbre (dénomination bizarre, sauf si on fait intervenir le temps) de 3eme niveau, il suffit de fait: Code: //T0 un seul processus
f1=fork();
// T1 2 processus
f2=fork();
// T2 4 processus
f3=fork();
// T3 8 processus
/*
| T0 un seul processus
|\
| \
| \
| \ 1er fork
| \
| \
| \
| | T1 2 processus
|\ |\
| \ | \ 2eme fork
| \ | \
| | | | T2 4 processus
|\ |\ |\ |\ 3e fork
| | | | | | | | T4 8 processus
*/ et il suffit de tester les f1, f2 et f3 pour savoir qui est qui...
| | |