Ressources matérielles : Poste de travail Linux Ubuntu
Ressources logicielles : Linux
Introduction
Durant cette séance, nous allons nous familiariser avec les processus Unix.
Après avoir utilisé les commandes de gestion des processus, nous réaliserons un programme
en langage C utilisant les appels système gérant les processus.
Les commandes de gestion des processus
Ouvrir un terminal sous Linux (Menu Applications/Accessoires/Terminal).
A l'aide de la commande ps -ef, afficher la liste détaillée des processus en exécution
sur votre poste de travail.
A l'aide de la commande ps -ef, afficher la liste détaillée des processus en
exécution ainsi que les utilisateurs correspondants.
Quel est le processus qui a pour identifiant (PID) la valeur 1 ? Quel est l'utilisateur
correspondant ?
Afficher la liste détaillée des processus lancés par vous (avec votre identifiant)
grâce aux commandes ps et grep.
Relever l'identifiant du processus (PID) correspondant à votre terminal (gnome-terminal).
A l'aide de la commande kill -9 <PID>
(par exemple, kill -9 2354 tue le processus de PID 2354),
détruire le processus correspondant à votre terminal.
Ouvrir un nouveau terminal sous Linux (Menu Applications/Accessoires/Terminal).
A l'aide de la commande ps -ef, examiner la hiérarchie des processus.
Pour chaque processus on voit apparaître son identifiant (PID) et l'identifiant de son père (PPID).
Relever le PID et le PPID de la commande tapée précédemment (ps -ef).
A quel processus correspond le PPID ? Quel est le lien avec le processus correspondant à votre
terminal (gnome-terminal)?
Les appels système de gestion des processus
Dans cette partie on se propose d'étudier le programme suivant :
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>
int main(int argc, char *argv[]) {
pid_t pid_fils;
pid_fils = fork(); // Création d'un nouveau processus
if (pid_fils == -1) {
fprintf(stderr, "fork() impossible, errno = %d\n", errno);
return 1;
}
if (pid_fils == 0) { // Le fils
printf("Début du Fils \n");
fprintf(stdout, "Fils : PID = %d, PPID = %d\n", getpid(), getppid());
sleep(5);
printf("Fin du Fils \n");
return 0;
}
else { // Le père
printf("Début du Père \n");
fprintf(stdout, "Père : PID = %d, PPID = %d, ", getpid(), getppid());
fprintf(stdout, "PID Fils = %d\n", pid_fils);
wait (NULL); // Attente de la fin du fils
printf("Fin du Père \n");
return 0;
}
}
L'appel système fork() va permettre de créer 2 processus, le processus original nommé le
père et un processus dupliqué nommé le fils. Ces 2 processus seront distingués par leur
numéro d'identification (PID) et il sera possible d'exécuter 2 codes différents en fonction du
retour de la fonction fork().
L'appel système wait() permet d'attendre la fin du processus fils. On récupère les identifiants
PID et PPID à l'aide des appels système getpid() et getppid().
Créer un sous-dossier nommé TestPID dans votre dossier personnel.
Ouvrir un éditeur de texte, gedit par exemple, recopier le programme ci-dessus.
Sous le nom test.c, enregistrer ce fichier dans le dossier TestPID.
Ouvrir 2 terminaux sous Linux (Menu Applications/Accessoires/Terminal).
Depuis le premier terminal, se placer dans le dossier TestPID puis créer l'exécutable.
On utilisera la commande : gcc test.c
A l'aide de la commande ./a.out, démarrer votre programme.
Avant que votre programme se termine, depuis le second terminal,
visualiser les processus à l'aide de la commande ps -ef.
(Relancer si nécessaire le programme depuis le premier terminal).
Relever et comparer les PID et les PPID affichés par le programme (premier terminal)
et ceux affichés par la commande ps -ef (second terminal).
Expliquer les résultats.