LES PROCESSUS 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

  1. Ouvrir un terminal sous Linux (Menu Applications/Accessoires/Terminal).
  2. A l'aide de la commande ps -ef, afficher la liste détaillée des processus en exécution sur votre poste de travail.
  3. A l'aide de la commande ps -ef, afficher la liste détaillée des processus en exécution ainsi que les utilisateurs correspondants.
  4. Quel est le processus qui a pour identifiant (PID) la valeur 1 ? Quel est l'utilisateur correspondant ?
  5. Afficher la liste détaillée des processus lancés par vous (avec votre identifiant) grâce aux commandes ps et grep.
  6. Relever l'identifiant du processus (PID) correspondant à votre terminal (gnome-terminal).
  7. 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.
  8. Ouvrir un nouveau terminal sous Linux (Menu Applications/Accessoires/Terminal).
  9. 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).
  10. 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().

  1. Créer un sous-dossier nommé TestPID dans votre dossier personnel.
  2. Ouvrir un éditeur de texte, gedit par exemple, recopier le programme ci-dessus.
  3. Sous le nom test.c, enregistrer ce fichier dans le dossier TestPID.
  4. Ouvrir 2 terminaux sous Linux (Menu Applications/Accessoires/Terminal).
  5. Depuis le premier terminal, se placer dans le dossier TestPID puis créer l'exécutable.
    On utilisera la commande : gcc test.c
  6. A l'aide de la commande ./a.out, démarrer votre programme.
  7. 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).
  8. 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.