Vous êtes sur la page 1sur 7

Faculté des Sciences de Tunis

Département des Sciences de l'Informatique 2020/2021

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) ;
}

Expliquez l’exécution de ce programme. Précisez en particulier le nombre de processus


engendrés par cette exécution. Combien d’occurrences de chaque type de message « fork i »
sont affichés ?
Réponse
Pour cet exercice un exemple d’exécution est donné dans la dernière page du TP. Une exécution avec 3
fork et une autre exécution avec 4 fork.
Pour 3 fork, on obtient au total 8 processus, fork 1 est affichée 2 fois, fork3 est affiché 4 fois et fork3 8
fois.

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;

printf("\nje suis pere %d\n",getpid());


p=fork();
if(p==0)
printf("\n je fils pid %d PPID=%d\n",getpid(), getppid());
else
{
p1=fork();
if(p1==0)
printf("\n je fils pid %d PPID=%d\n",getpid(), getppid());
else
wait(0);
}

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

b) Déduire les modifications apportées au code de la question 1, qui a pu généré cette


exécution.

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;

printf("\nje suis pere %d\n",getpid());


for(i=0;i<2;i++)
{
p=fork();
if(p==0)
printf("\n je fils pid %d PPID=%d\n",getpid(), getppid());
else
{
p1=fork();
if(p1==0)
printf("\n je fils pid %d PPID=%d\n",getpid(), getppid());
else
wait(0);
}

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

./tf avec 3 fork


pid=9246 ppid=9245 fork1
pid=9245 ppid=9155 fork1
pid=9247 ppid=9246 fork2
pid=9249 ppid=9247 fork3
pid=9248 ppid=9245 fork2
pid=9247 ppid=9246 fork3
pid=9246 ppid=9245 fork2
pid=9250 ppid=9248 fork3
pid=9251 ppid=9246 fork3
pid=9246 ppid=9245 fork3
pid=9245 ppid=9155 fork2
pid=9252 ppid=9245 fork3
pid=9245 ppid=9155 fork3
pid=9248 ppid=1 fork3

Anissa OMRANE 7