Systèmes d’exploitation
TD-TP - Gestion des processus Corrigé
Exercice 1
Soit le programme suivant :
int main(void)
{
fork() ; printf("fork 1 \n") ;
fork() ; printf("fork 2 \n") ;
fork() ; printf("fork 3 \n") ;
return(0) ;
}
Exercice 2
1. Soit la séquence de code suivante
int pid;
int i;
for(i=0;i<=2;i++)
{
pid=fork() ;
}
Combien de processus sont crées par le code du processus P? Dresser un schéma montrant
quels sont les processus créés pour chaque valeur de i.
Réponse
Pour cet exercice comme pour l’exercice 1, la boucle se traduit comme 3 fork, on obtient au total 8
processus.
Rouge : i=0
Vert :i =1
Bleu : i=2
Anissa OMRANE 1
2. Soit la séquence de code suivante constituant un premier processus p:
// Code du processus P // Code du processus P1
int pid; int pid;
int i; int i;
for(i=0;i<=2;i++) for(i=0;i<=2;i++)
{ {
pid=fork() ; pid=fork() ;
if(pid==-1) exit(-1); if(pid==-1) exit(-1);
else else
if(pid==0) if(pid==0)
printf(”Bonjour”); {
else printf(”Bonjour”);
printf(“Je suis i=0;
père”); }
else
} printf(“Je suis père”);
}
a. Combien de processus sont crées par le code du processus P ? dresser un schéma
montrant quels sont les processus créés pour chaque valeur de i.
b. Combien de fois sera affiché le message « bonjour » ?
c. Combien de fois sera affiché le message «Je suis père » ?
d. Que se passe t il si on transforme le code de P en celui de P1.
Réponse
Le code de 1 donne aussi 8 processus, le message bonjour sera affiché 7 fois par les 7 fils. Je suis père est
affiché 7 fois aussi mais 3 fois par le premier processus père, 2 fois pas le premier fils crées et une fois par
les deux autres fils créés.
Lorsqu’on ajoute le i=0 dans le code il y a des fils qui meurt et d’autre naissent
Anissa OMRANE 2
Exercice 3
1. Soit l’exécution suivante d’un programme c :
Je suis le processus fils 3501 mon papa est 3500
Je suis le processus fils 3502 mon papa est 3500
Je suis le processus pere 3500
Ecrire le programme C qui aurait permis la génération d’une telle arborescence.
Réponse
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
void main()
{
int i, p, p1;
wait(0);
}
}
2. On modifie le code de ce programme on obtient l’affichage suivant :
Je suis le processus fils 3548 mon papa est 3547
Je suis le processus fils 3549 mon papa est 3548
Je suis le processus fils 3550 mon papa est 3548
Je suis le processus pere 3548
Je suis le processus fils 3551 mon papa est 3547
Je suis le processus fils 3552 mon papa est 3551
Je suis le processus fils 3553 mon papa est 3551
Je suis le processus pere 3551
Je suis le processus pere 3547
Je suis le processus fils 3554 mon papa est 3547
Je suis le processus fils 3555 mon papa est 3547
Je suis le processus pere 3547
Anissa OMRANE 3
a) Décrire l’arborescecne des processus générée
Réponse
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
void main()
{
int i, p, p1;
wait(0);
}
}
Anissa OMRANE 4
Exercice 5
1. Ecrire un programme C qui permet de créer l’arborescence ci-dessous formée par les
processus Pa, Pb, Pc, Pd, Pe, Pf, Pg. Chaque processus affiche la lettre qui lui correspond
(exemple : le processus Pa, affiche « je suis le processus a »)
Pa
Pb Pc
Pd Pe Pf Pg
2. Que faut-il faire pour que le processus Pa, attende la terminaison de tous les autres
processus ?
Anissa OMRANE 5
#include <stdio.h>
#include <unistd.h>
void main()
{
int pida,pidb,pidc,pidd,pide,pidf,pidg;
int i;
// pida=getpid();
printf("je suis le processus a %d\n",getpid());
pidb = fork();
if(pidb==0)
{
printf("je suis le processus b %d et mon papa est a %d
\n",getpid(),getppid());
pidd = fork();
if(pidd==0)
{
printf("je suis le processus d %d et mon papa est b %d
\n",getpid(),getppid());
}
else
{
pide = fork();
if(pide==0)
{ printf("je suis le processus e %d et mon papa est b
%d\n",getpid(),getppid());
}
else
{
pidf = fork();
if(pidf==0)
{ printf("je suis le processus f %d et mon papa est b
%d\n",getpid(),getppid());
}
else
{ wait(); wait(); wait();}
}
}
}
else
{
pidc = fork();
if(pidc==0)
{ printf("je suis le processus c %d et mon papa a %d
\n",getpid(),getppid());
pidg = fork();
if(pidg==0)
{ printf("je suis le processus g %d et mon papa est c
%d\n",getpid(),getppid());}
else
wait();
}
else
{
wait();
}
}
}
Anissa OMRANE 6
Exemple d’exécution du programme
./ex ./ex
i= 0 bonjour pid=31015 ppid=31014 i= 0 bonjour pid=32204 ppid=32203
i= 0 je suis le pere 31014 i= 1 bonjour pid=32205 ppid=32204
i= 1 bonjour pid=31016 ppid=31015 i= 2 bonjour pid=32206 ppid=32205
i= 2 bonjour pid=31017 ppid=31016 i= 2 je suis le pere 32205
i= 2 je suis le pere 31016 i= 1 je suis le pere 32204
i= 1 bonjour pid=31018 ppid=31014 i= 0 je suis le pere 32203
i= 1 je suis le pere 31015 i= 2 bonjour pid=32207 ppid=32204
i= 2 bonjour pid=31020 ppid=31015 i= 2 je suis le pere 32204
i= 2 je suis le pere 31015 i= 1 bonjour pid=32208 ppid=32203
i= 2 bonjour pid=31019 ppid=31018 i= 2 bonjour pid=32209 ppid=32208
i= 2 je suis le pere 31018 i= 2 je suis le pere 32208
i= 1 je suis le pere 31014 i= 1 je suis le pere 32203
i= 2 bonjour pid=31021 ppid=31014 i= 2 bonjour pid=32210 ppid=32203
i= 2 je suis le pere 31014 i= 2 je suis le pere 32203
Anissa OMRANE 7