0% ont trouvé ce document utile (0 vote)
105 vues2 pages

Primitives Fork et Wait en C

Le document présente trois exercices sur l'utilisation des primitives fork et wait sous Unix/Linux. Le premier exercice demande de construire l'arbre des processus d'un programme forkant deux fois et d'expliquer son affichage. Le deuxième exercice demande d'expliquer le résultat d'un programme forkant une fois avec une variable partagée. Le troisième exercice demande de compléter un programme créant des processus joueurs en attente les uns des autres.

Transféré par

Ahmed Amir
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
105 vues2 pages

Primitives Fork et Wait en C

Le document présente trois exercices sur l'utilisation des primitives fork et wait sous Unix/Linux. Le premier exercice demande de construire l'arbre des processus d'un programme forkant deux fois et d'expliquer son affichage. Le deuxième exercice demande d'expliquer le résultat d'un programme forkant une fois avec une variable partagée. Le troisième exercice demande de compléter un programme créant des processus joueurs en attente les uns des autres.

Transféré par

Ahmed Amir
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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