La fonction fork()

Fermé
Anonyme09 - Modifié le 18 août 2017 à 10:05
 Anonyme09 - 17 août 2017 à 16:14
Bonjour,

Je voudrais savoir comment le système d’exploitation affecte les PID au processus père et fils.

J'ai ce programme et je n'arrive pas a comprendre comment on a affecté les PID

for(fork();(getpid()%2==0)&&(i<4); (i++,fork()))


Si on prend le pid du processus main 2400, on aurait

                    2400
2401 2402 2403 2404 2405 (1)
2406 2407 2408 2409 (2)
2410 2411 (3)
2412



Les fils du 2400 sont ceux de (1) normalement 2404 sera le processus fils du 2402 et pas 2400 ???

SVP aidez moi et merci par avance.

4 réponses

yg_be Messages postés 23323 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 novembre 2024 Ambassadeur 1 551
11 août 2017 à 21:36
bonsoir, que ne comprends-tu pas?
les pid n'ont pas de signification, chaque processus du système doit simplement avoir un pid unique, différent des pid de celui de chacun des autres processus.
0
Salut,

En fait, c'est un exercice

int i=0;

for(fork(); ((getpid()%2 ==0)&&(i<4); (i++,fork()));
while(wait(NULL)!=-1);


On suppose que le pid du processus correspond a ce programme est 2400 et la numérotation des processus est séquentielle

Donnez le résultat à l'exécution.

Normalement il nous donne l'arbre que j'ai présenté mais je n'ai pas compris comment affecter les PIDs.
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
Modifié le 16 août 2017 à 01:49
Un processus avec un pid pair fait : fork() N fois.
Un processus avec un pid impair a le test faux et s'arrête.
Pour le processus initial i vaut 0 1 2 3 4 donc N vaut 5, il aura 5 fils.
Pour un processus fils, i pars du i du père jusqu'à 4
pere pid2400,i=0  ->  fils pid2401,i=0  ->  pid2401,stop
pere pid2400,i=1  ->  fils pid2402,i=1
Mais ici 2 process sont en concurrence
fils pid2402,i=1  ->  petit-fils pidXXXX,i=1
pere pid2400,i=2  ->  fils pidYYYY,i=2
Impossible de savoir celui qui sera le premier! L'un produira le pid2403 qui s'arrête, et l'autre le pid2404. Mais sera-ce "petit-fils pid2404,i=1" ou "fils pid2404,i=2" ? C'est ce que tu as dis, on ne peut pas savoir si 2404 sera fils de 2400 ou de 2402.

L'exercice n'a pas de sens comme l'a déjà dit ElementW. C'est une grave erreur d'incompréhension de ce qu'est un processus!
0
mais le fils du 2402 quand i=1, PID=2406 est ça ce que je n'arrive pas à comprendre normalement PID=2404
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
16 août 2017 à 08:31
Bonjour,

Les PID sont uniques pour l'ensemble du système d'exploitation, donc d'autres programmes qui s'exécutent en même temps possèdent également des PID dont les valeurs ne pourront pas être données à ton programme.

La seule valeur importante dans le fork c'est le 0, ça te permet de distinguer si tu es dans le processus père ou le processus fils, pour le reste la valeur du PID n'a aucune importance, ils sont juste uniques pour les processus vivants à un instant donné.

À lire : que fait un fork ?
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
Modifié le 11 août 2017 à 21:57
'lut,
non seulement comme le dit yg_be les PID n'ont pas de réelle signification,
en plus, à moins que tu ne sois sur un UNIX(-like) temps réel (indice: ce n'est pas ton cas), l'attribution des PID est faite au hasard dans la hiérarchie des processus car tu n'as aucune garantie de quel process va fork() avant l'autre.
L'ordonnanceur (scheduler) se réserve le droit d'exécuter tel ou tel process dans l'ordre qu'il veut, potentiellement en parallèle dans le cas d'un système multi-cœur, avec un ordre d'exécution allant, pour un ensemble de processus connus, de quasi-prévisible (pour
SCHED_DEADLINE
) à beaucoup plus hasardeux pour Completely Fair Scheduler.
from human import idiocy
del idiocy
-1
Salut,

Au faite, c'est un exercice

int i=0;

for(fork(); ((getpid()%2 ==0)&&(i<4); (i++,fork()));
while(wait(NULL)!=-1);

on suppose que le pid du processus correspond a ce programme est 2400 et la numérotation des processus est séquentielle
donnez le résultat à l'exécution.

normalement il nous donne l'arbre que j'ai présenté mais j'ai pas compris comment affecter les num du PIDs.
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228 > Anonyme09
16 août 2017 à 02:25
Avec ce que je viens de dire, la seule garantie que tu auras avec une attribution séquentielle des PID c'est une relation d'ordre sur ce PID entre les processus pères et fils: les fils auront un PID plus grand que leur pères.
Pour être sûr qu'on puisse obtenir un arbre qui ne changera pas selon les cas, il faut en plus que l'ordonnanceur ait un ordre d'exécution défini, et ce semble ne pas être le cas dans ton exercice. Demande des précisions.
0
yg_be Messages postés 23323 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 novembre 2024 1 551 > Anonyme09
16 août 2017 à 08:51
si c'est un exercice avec des suppositions, il suffit de le résoudre par raisonnement, non?
0
Anonyme09 > ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021
16 août 2017 à 13:51
l'algorithme d’ordonnancement est FIFO ou (FCFS)
0
ce que je n'arrive pas à comprendre le fils du 2402 quand i=1, PID=2406 normalement PID=2404, non?
0