Faculté des Sciences de Monastir
Systèmes d’Exploitation II
Département des Sciences
LSI 1
de l’Informatique
TP n° 2
Programmation des processus sous GNU/Linux
1. Quelques primitives de gestion des processus
Il s’agit de primitives et de fonctions de la bibliothèque C standard unistd.h, qui donnent
des informations générales sur les processus qui les utilisent.
1.1. Identification de processus
getpid() et getppid() fournissent respectivement l’identifiant du processus appelant et
celui de son processus parent.
1.2. Mise en sommeil d’un processus
sleep(n) suspend l’exécution du processus appelant pour une durée de n secondes.
1.3. Création de processus : fork()
Cette primitive permet la création dynamique d’un nouveau processus, qui s’exécute de
façon concurrente avec le processus qui l’a créé. fork() entraîne la création d’un nouveau
processus, qui est une copie exacte du processus appelant. Cela signifie que le processus ainsi
créé, appelé processus fils, hérite du processus qui l’a créé, appelé processus parent, d’un
certain nombre de ses attributs :
• le même code ;
• une copie des zones mémoires ;
• l’environnement, la priorité, les différents propriétaires.
Le seul moyen de distinguer le processus fils du processus parent est la valeur de retour
de la fonction fork(). Elle vaut zéro dans le processus fils créé, et elle est égale à l’identifiant du
processus fils (différent de zéro) dans le processus parent.
Si la primitive fork() échoue (et qu’il n’y a donc pas création d’un nouveau processus), la
valeur de retour de la fonction est -1. C’est le cas si l’utilisateur a lancé trop de processus, ou si le
nombre total de processus sur le système est trop élevé.
1.4. Synchronisation de processus : wait()
La primitive wait() de la bibliothèque (sys/wait.h) permet de remédier à l’effet
désagréable et parfois indésirable lié à la terminaison d’un processus avant celle de ses fils. La
primitive wait() provoque la suspension du processus appelant jusqu’à ce que l’un de ses
processus fils se termine. Une syntaxe simplifiée est la suivante :
int wait(NULL)
On appelle processus un objet dynamique correspondant à l’exécution d’un programme
ou d’une commande GNU/Linux. Cet objet regroupe plusieurs informations, en
particulier l’état d’avancement de chaque programme, l’ensemble des données qui lui
sont propres, ainsi que d’autres informations sur son contexte d’exécution.
TP n°2 – Programmation des processus sous GNU/Linux 1/3
Systèmes d’Exploitation II LSI 1
2. Exercices
Pour tous les exercices, les fichiers créés doivent être sauvegardés dans le
répertoire qui porte le numéro de votre groupe de TP, par exemple
groupe01 pour le groupe du TP n°1.
Exercice 1
Soit le programme suivant :
#include<stdio.h>
#include<unistd.h>
int main() {
int f, i=2;
f=fork();
switch(f) {
case -1 : printf("Erreur dans fork() !!");
return 1;
case 0 : /* C’est le processus fils */
i ++;
printf ("Processus fils i= %d\n",i);
break;
default : /* C’est le processus père */
i --;
printf ("Processus père i = %d\n",i);
break;
}
sleep(5);
printf ("Fin %d\n",i);
return 0;
}
Exécuter et interpréter le résultat de ce programme.
Exercice 2
Soit le programme suivant :
int main() {
fork();
fork();
fork();
return 0;
}
1. Sur papier et avant d’écrire le programme :
a) Si tous les appels fork() réussissent, combien de processus le programme
suivant crée-t-il ?
b) Dessiner l’arbre des processus qui seront engendrés.
2. Sur machine – les questions a) et b) sont indépendantes – :
a) Ajouter une ligne au programme pour qu’il affiche les identifiants (PID et
PPID) des processus créés.
b) Ajouter une ligne au programme initial pour pouvoir afficher les identifiants
(PID et PPID) des processus créés depuis la ligne de commande du shell.
c) Pour chaque question – a) et b) –, dessiner l’arbre des processus engendrés.
TP n°2 – Programmation des processus sous GNU/Linux 2/3
Systèmes d’Exploitation II LSI 1
Exercice 3
1. Écrire un programme C qui crée deux processus, le père affiche les entiers de 1 à 5
avec un intervalle de 1 seconde et le fils ceux de 6 à 10 avec un intervalle de 2 secondes.
2. Écrire un programme C qui crée deux processus fils, l’un affiche les entiers de 1 à 5
avec un intervalle de 2 secondes, l’autre de 6 à 10 avec un intervalle de 1 seconde.
3. Modifier les deux programmes précédents pour garantir que l’affichage des entiers se
fait dans l’ordre croissant.
TP n°2 – Programmation des processus sous GNU/Linux 3/3