• Aucun résultat trouvé

TP 4 Système d’exploitation 2:

N/A
N/A
Protected

Academic year: 2022

Partager "TP 4 Système d’exploitation 2:"

Copied!
7
0
0

Texte intégral

(1)

Année universitaire:

2019-2020

TP 4 Système d’exploitation 2:

Gestion des processus entre père et fils

SMI - S4

Cours donné par:

Pr. N. ALIOUA

1

(2)

Processus

• getuid () : id du propriétaire réel c’est à dire l’utilisateur qui a lancé le processus. En général, c’est celui du login

• geteuid () : id du propriétaire effectif : un processus se voit allouer

temporairement des permissions d’un autre utilisateur, pour pouvoir exécuter un programme ou manipuler un fichier. Les permissions allouées sont celles de l’utilisateur propriétaire du programme ou fichier en question.

• getgid () : id du groupe réel

• getegid () : id du groupe propriétaire effectif

• getcwd () : répertoire de travail courant

(3)

1. a) Sens de la fonction nice():

• La valeur incluse dans l’appel de la fonction nice est indicateur sur la priorité du processus.

• Un processus nice (gentil) laisse passer les autres processus avant lui pour qu’ils s’exécutent en UCT.

• Plus à l’intérieur de nice est grande, plus le processus en question a tendance à laisser passer les processus et il a donc moins de priorité.

• Il faut chercher dans le man la fonction nice (et non pas la

commande). En général, les fonctions se trouvent dans la section 2 du man (man 2 nice)

A. Héritage

(4)

2. b) Ce code permet de voir les différentes variables d’environnement qu’hérite le fils de son père

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>

char buf[1024]; /* pour récupérer le répertoire de travail, utilisez la fonction getcwd */

void main(){

int i;

nice(10); /* augmentation de 10 de la valeur du nice avant le fork*/

if (fork()==0) {

printf("*****caractéristiques du fils*****\n ");

printf("uid=%d euid= %d egid=%d\n ", getuid(), geteuid(), getegid());

printf("répertoire de travail : %s\n ",getcwd(buf,1024));

printf("nice(0) : %d\n",nice(0));

}

else{

sleep(5); /* pour partir après la terminaison du fils */

printf("*****caractéristiques du père*****\n ");

printf("uid=%d euid= %d egid=%d\n ", getuid(), geteuid(), getegid());

printf("répertoire de travail : %s\n ",getcwd(buf,1024));

printf("nice(0) : %d\n",nice(0));

} }

A. Héritage

(5)

A. Héritage

2) Exécutez et interprétez le résultat:

• On constate que les variables m, n et w changeront de valeur selon le processus en exécution (père ou fils).

• La variable non initialisée dans le père, qui est w, aura une valeur aléatoire.

• On voit ici que le fils n’a pas initialisés les valeurs m et n et pourtant, il récupère les valeurs initialisées par le père.

• On voit que lorsque le fils change les valeurs de w, m et n celles-ci demeurent inchangées dans le père (voir le dernier affichage).

• Ainsi, on confirme ce qui a été vu dans le cours: le fils a un espace

d’adressage séparé de celui du père et il récupère les variables par valeur.

(6)

B. Wait

• Ce code permet de voir l’utilisation de l’appel système wait lancé par le père

• La fonction wait permet au père d’attendre (attente bloquante) le premier processus fils qui se termine.

• L’attente bloquante signifie que le père ne pourra pas continuer son exécution jusqu’à ce que l’un de ces fils exécute l’appel système exit()

• Le père récupère dans la variable status, qui est passée par adresse, le statut de sortie du fils (qui égal à 10 ici).

• Dans la variable returnWait, le père récupère le pid du premier fils qui se termine.

• L’utilisation de wait et exit est un moyen de communication simple entre père et fils.

• On peut imaginer un switch case dans le père qui sera dépendant de la valeur envoyée par le fils dans exit et selon cette valeur un traitement différent sera déclenché par le père

(7)

C. Waitpid

• Waitpid est une fonction (man 2 waitpid) qui permet au père d’attendre un fils particulier (en précisant son pid). Cette fonction impose une attente bloquante au père (il ne pourra rien faire sauf si le fils particulier exécute l’appel système exit())

• WNOHANG est une option de la fonction waitpid qui dit au processus père de ne pas faire une attente bloquante et de continuer ses traitements (c’est le principe de l’attente active).

• En utilisant l’option WNOHANG, la fonction waitpid() retourne 0 si le fils particulier n’a pas encore appelé exit(), sinon elle retourne le pid de ce fils.

• Grâce à cette particularité, le père peut utiliser la boucle do while avec comme condition retourWP==0. Ce qui lui permet de boucler en attendant que le fils particulier appel exit().

• Cela est utile ici puisque le fils exécute un appel sleep(5), qui lui impose de s’endormir pendant 5 secondes.

• La variable retourFils permet de récupérer le statut de sorti du processus fils par le processus père

Références

Documents relatifs

Et le Père apparaît alors comme étant lui aussi le Serviteur du Fils dans l’accomplissement de leur volonté commune, pour notre seul bien… C’est ainsi que le Père est

Ce théorème est d'ailleurs bien connu, mais nous allons montrer qu'on peut le faire apparaître comme une conséquence presque immédiate d'une pro- position d'Ascoli relative

LECTURE DES ENTRES EXECUTION DU PROGRAMME EXECUTION DU PROGRAMME 20% DE TEMPS LIBRE ECRITURE DES SORTIES DUREE D'UN CYCLE AUTOMATE.. 94736 NOGENT

• Cadrage et points clés de mise en œuvre d’un projet de Spend analysis.. •

Recherche et affiche le contenu d’une cellule donnée dans un tableau, qui correspond à une valeur entrée présente en première

Lors du démarrage du PC à l'aide d'un disque système ne contenant pas d'AUTOEXEC.BAT différents problèmes apparaissent. Le premier est que les fichiers exécutables MS-DOS se

Visualisez les processus de votre session courante utiliser la commande ps2. Affichez les processus

• La fonction read permet la lecture depuis le pipe en précisant le descripteur du pipe ouvert, le tableau de type char qui va contenir le message lu ainsi que sa taille. • Le