UNIVERSITE IBNOU ZOHR,
FACULTE DES SCIENCES 2016-2017
DEPARTEMENT INFORMATIQUE
AGADIR
Solution épreuve Systèmes d’Exploitation II – SMI4/II4 (session de rattrapage)
Durée : 2h00
Exercice 1 (13 pts):
Q1- 2n
Q2- Donnez le contenu du fichier « file » à la fin de l’exécution de chacun des codes suivants :
(b) (c)
(a) int main(){ int main(){
int main(){
int fd; int fd;
int fd;
char* buffer= “toto” ; char* buffer= “toto” ;
char* buffer= “toto” ;
if((fd=open(“file”, O_WRONLY |O_APPEND))>0) { if((fd=open(“file”,
if((fd=open(“file”, O_RDONLY))>0) {
lseek(fd,8, SEEK_SET); O_WRONLY|O_APPEND|O_TRUNC))>0) {
lseek(fd,8, SEEK_CUR);
if(write(fd,buffer,sizeof(buffer))>0){ lseek(fd,8, SEEK_SET);
if(write(fd,buffer,sizeof(buffer))<0){
perror(“Erreur write”); if(write(fd,buffer,sizeof(buffer))<0){
perror(“Erreur write”); exit(1);
exit(1); perror(“Erreur write”);
}
} exit(1);
}
} }
return(0);
return(0); }
}
} return(0);
}
On suppose, qu’avant chaque exécution, le fichier «file» contient la chaîne de caractères ASCII suivante :
Bonjour SMI4
(a) Contenu :Bonjour SMI4
Pourquoi ? : car le fichier est ouvert en lecture seul donc pas de possibilité d’écriture
(b) Contenu : Bonjour SMI4
toto
justificatif : Le fichier est ouvert en écriture en mode ajout (O_EPPEND) ==> écriture à la fin du fichier
(c) contenu : toto
justificatif : Le fichier est ouvert en écriture en mode ‘trunc’ (O_EPPEND) à chaque ouverture le contenu
initial sera écrasé avant toute opération d’écriture ou de lecture.
Q3- Les états d’un processus (voir cours) : prêt, élu, bloqué
Transitions possibles exemple
-------------------------------------------
Prêt-- > élu processus attend le processeur, une fois il a eu il s’exécute ‘relance par
l’ordonnaceur).
Elu --- > bloqué attente d’une entrée sortie (E/S).
Bloqué -- > prêt fin d’une E/S.
Elu --- > prêt fin d’un quantum, ou arrivé d’un processus plus prioritaire.
1/2
Q4- Dans quel état est le processus pour chacun des deux cas suivants ?
1- bloqué
2- prêt
Q5- Soit le diagramme de Gantt suivant :
P1 inactif P2 inactif P3 P2 P3 inactif P1 P2
0 2 3 5 6 8 10 12 14 16 18
1- l’état du processus P1 à t=3 ? == > bloqué
2- le temps d’arrivée du processus P2 et P3.== > P2 : ta=3 ; P3 : ta=6
3- le processeur est inactif entre les instants t = 5 et t = 6 : P1 et P2 sont dans état bloqué
4- l’état des processus P1 et P2 entre t=10 et t=12 ?. P1 et P2 sont plus prioritaire que P3 donc
forcément P1 et P2 sont dans un état bloqué
Q6- Soit le programme suivant :
int main(){ L’arbre généalogique affichage de chaque processus créé
pid_t pid;
int f=10, status ; P0 (main) 4 20
if(fork()==0){
if(fork()==0){
printf("1"); P1 2 20
f=f+10;
printf("f=%d",f);
}else{ P2 1 20 3 30
wait(status);
printf("2");
f=f+10;
printf("f=%d",f);
exit(1);
}
printf("3");
f=f+10;
printf("%d",f);
}
printf("4");
f=f+10;
printf("f=%d",f);
return 0;
}
2/2
Exercice 2 (3 pts) :
#include <stdio.h>
#include <unistd.h>
#include<fcntl.h>
creatP(){
int i, pid;
for(i=1 ;i<=4 ;i++){
if((pid=fork())>0){
break; // si pere on quitte
}else{ // le fils
printf("pid=%d---PPId=%d\n",(int) getpid(),(int) getppid());
}
int main(){
int pid;
pid=fork();
if(pid==0){// 1er fils
printf("pid=%d---PPId=%d\n",(int) getpid(),(int) getppid());
}else{
createP(); // les fils de P2 à P5
}
return 0 ;
Exercice 3 ( 4 pts) :
Le programme prog.c doit donc juste lire ce qui sort du tube (lire le stdin= descripteur 0)
3/2