UMBB _FS Année universitaire 2020-2021
Département d’informatique Semestre 4 Matière : SE2
TP1 : Gestion des processus
1. processus, PID, UID
1.1 Processus et PID
Chaque programme (fichier exécutable ou script shell, Perl) en cours d'exécution dans le
système correspond à un (ou parfois plusieurs) processus du système. Chaque processus
possède un numéro de processus PID (Process IDentifier).
Sous Unix on peut voir la liste des processus en cours d'exécution, ainsi que leurs PID par la
commande
$ ps.
Pour voir ses propres processus en cours d'exécution on peut utiliser la commande
$ ps x
Pour voir l'ensemble des processus du système on peut utiliser la commande
$ ps –aux
Pour voir l'ensemble des attributs des processus on peut utiliser l'option -f. Par exemple, pour
l'ensemble des attributs de ses propres processus on peut utiliser
$ ps -f x
un programme peut accéder au PID de son instance en cours d'exécution par la fonction
getpid(), qui retourne le PID.
1.2 Privilèges, UID, Set-UID
Chaque processus possède aussi un User ID, noté UID, qui identifie l'utilisateur qui a lancé le
processus. C'est en fonction de l'UID que le processus se voit accorder ou refuser les droits
d'accès en lecture, écriture ou exécution à certains fichiers ou à certaines commandes. Un
programme C peut accéder à l'UID de son instance en cours d'exécution par la fonction
getuid() :
uid_t getuid(void) ;
2. La primitive fork, getpid, getppid
fork est un appel système qui permet de créer un nouveau processus à partir d'un programme.
Le processus créé (fils) est obtenu par duplication du processus appelant (père). Donc les deux
auront le même code.
Afin de distinguer le père du fils, fork retourne :
- 0 au processus fils ;
- Le pid du fils au père ;
- La valeur -1 en cas d’erreur (par exemple s’il n y a pas assez d’espace mémoire, si le
nombre maximal de processus est atteint…).
UMBB _FS Année universitaire 2020-2021
Département d’informatique Semestre 4 Matière : SE2
Lors de l'exécution de l'appel-système fork, le noyau effectue les opérations suivantes :
il alloue un bloc de contrôle dans la table des processus pour le processus fils ;
il copie le contenue du bloc de contrôle (PCB) du père dans celui du fils sauf les
identificateurs (PID, PPID...).
il affecte un PID au processus fils ;
il associe au processus fils un segment de texte dans son espace d'adressage. Le
segment de données et la pile ne lui seront attribués uniquement lorsque celui-ci
tentera de les modifier. Cette technique, nommée « copie on write », permet de réduire
le temps de création du processus.
Remarque :
Les deux processus (le père et le fils) s’exécutent en parallèle. Le fils commence son
exécution avec la même adresse dans le compteur ordinal que celle du père : adresse de
l’instruction qui suit le fork.
TP1
Sou linux utiliser l’éditeur de texte gedit pour saisir le code suivant. Sauvegarder le fichier
sous le nom tp1.c dans le répertoire home. Pour compiler votre code utiliser la commande :
gcc tp1.c
Pour l’exécuter utiliser la commande :
./a.out
#include <stdio.h>
#include <unistd.h>
int main(){
int pidfils = fork() ;
if (pidfils != 0){
printf(''je suis le père , mon PID est : %d\n'', getpid()) ;
print (''PID de mon fils : %d\n'', pidfils) ;
} else {
printf(''je suis le fils'\n') ;
printf(''mon PID est : %d\n'', getpid()) ;
printf(''le PID de mon père est : %d\n'', getppid()) ;
}}
3. Les primitives wait, exit et sleep
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void){
pid_t pidfils ;
pidfils = fork();
if (pid_fils == -1)
{
puts(‘erreur de création du nouveau processus’) ;
exit (1) ;
UMBB _FS Année universitaire 2020-2021
Département d’informatique Semestre 4 Matière : SE2
}
if(pidfils == 0){
printf(''je suis le fils , mon PID est : %d\n'', getpid()) ;
seep(5) ;
printf (''Arrêt du fils.\n'‘) ;
exit(0) ;
} else {
printf(''je suis le père\n'') ;
wait(0);
printf(''mon fils a terminé.\n'') ;
}}
Exercices :
Exercice 1 (*)
Programmer sous linux le code suivant, observer et expliquer les identificateurs de processus
rendus par getpid() et getppid().
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main (void)
{ Pid_t
pid_fils ;
switch (pid_fils= fork()){
case -1 :
perror(‘fork’) ;
exit(1) ;
case 0:/* le fils */
printf (‘je suis le fils, PID %d, PPID %d\n’, getpid(), getppid()) ;
exit (0) ;
default : /* le pere*/
printf (‘je suis le père, PID %d. mon fils a le PID %d\n’, getpid(), pid_fils) ;
(void) wait (NULL) ;
exit(0) ;
}}
Exercice 2(*)
Que fait le programme suivant ?
int i=2 ;
int main ()
{ j=10 ;
int p ;
while (i-- && p=fork())
if (p<0) exit(1) ;
j+=2 ;
if (p==0)
{ i*=3
;
j*=3 ;
} else {
i*=2 ;
UMBB _FS Année universitaire 2020-2021
Département d’informatique Semestre 4 Matière : SE2
j*=2 ;
}
printf (’i=%d, j=%d’, i, j) ;
return 0 ;
}
Exercice 3 (**)
Ecrire un programme avec un processus père qui engendre 5 fils dans une boucle for. Les fils
sont nommés fils 1 à fils 5. Le fils 1 doit afficher ‘je suis le fils 1’ et le fils 2 doit afficher ‘je
suis le fils 2’, et ainsi de suite.