Vous êtes sur la page 1sur 2

Faculté des Mathématiques et de l’Informatique 3ème année Licence ISIL

Département d’Informatique Module : Système d’exploitation II

Tp 1 : Les primitives fork et wait


Exercice 1. Exécutez le programme suivant :
#include <unistd.h>
#include<stdio.h>
int main(void){
int x=getpid();
fork();fork();
x=x+getpid();
printf("Process %d:Hello,my father is %d, x value is
%d\n",getpid(),getppid(),x);
return 0;}

1 construire l’arbre des processus de ce programme après exécution.


2 Expliquer l’affichage de ce programme

Exercice 2. Considérer le programme suivant :

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
int main(void) {
int x = 10;
int pid = fork();
if (pid==-1) {
printf("Echec du fork()\n");
exit(-1);}
if (pid == 0) { x=x+3; sleep(5);}
else { x=x-3;
printf("le pere attend la fin du fils\n");
wait(NULL);}
printf("Processus %d : La valeur de x : %d \n",getpid(),x);
exit(0);
}

1. Pourquoi le dernier printf est exécuté deux fois ?


2. Pourquoi on a deux valeurs différentes de x ? Expliquer le résultat d’exécution de ce
programme.
Exercice 3
#include <unistd.h>
#include <stdlib.h>
#include<stdio.h>
#include <sys/wait.h>
void jouer(int NumJoueur);
//NumJoueur est le numéro du joueur 0..MaxJoueurs-1
#define MaxJoueurs 4
int main( )
{
// créer MaxJoueurs processus fils du processus principal
// chaque joueur exécute la fonction jouer puis se termine
while(1)
{
// attendre la fin d'un joueur
//lorsqu'un joueur se termine, un autre joueur de même numéro //est créé
}return 0;
}
Complétez le programme en ajoutant le code qui réalise exactement les traitements spécifiés sous forme de
commentaires.
Faculté des Mathématiques et de l’Informatique 3ème année Licence ISIL
Département d’Informatique Module : Système d’exploitation II

Processus : waitpid()
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

main(void) {

int pid1 = fork();


if (pid1< 0) {
printf("Error ");
return 1 ;
}

if (pid1 == 0) {
sleep(4) ;
printf("Le processus a fini sont exécution .(%d) \n",getpid());
return 0 ; }
int pid2 = fork();
if (pid2< 0) {
printf("Error ");
return 2 ; }
if (pid2 == 0) {
sleep(1) ;
printf("Le processus a fini sont exécution .(%d) \n",getpid());
return 0 ;
}
int pid1_res = Waitpid(pid1,NULL,0) ;
printf("En attente de .(%d) \n", pid1_res);
int pid2_res = Waitpid(pid2,NULL,0) ;
printf("En attente de .(%d) \n", pid2_res);
return 0 ;
}

Que ce passe il si ont :

1- Remplace : Waitpid(pid1,NULL,0) avec Waitpid(pid1,NULL,WNOHANG) Et avec

Waitpid(pid2,NULL, WNOHANG)

2- avec Waitpid(pid1,NULL,WIFCONTINUED(status)) Et avec

Waitpid(pid2,NULL,WIFCONTINUED(status))

Vous aimerez peut-être aussi