BCI Informatique

TP processus

B. Dupouy et S. Gadret


SOMMAIRE

  1. Organisation du TP :
  2. Utilisation des commandes du shell
  3. Introduction aux exercices en C
  4. Création de processus (fonction fork)
    1. Fonctions utilisées
    2. Exercice 1
    3. Exercice 2
  5. Synchronisation de processus père et fils (mécanisme wait/exit)
    1. Fonctions utilisées
    2. Mécanisme wait/exit
  6. Père et fils exécutent des programmes différents
    1. Fonction utilisée
    2. Fonctionnement de exec
  7. Exercice à rendre


Organisation du TP:

1ère partie Exemples à faire fonctionner
2ème partie Exercice à rendre. L'envoyer par mail à l'enseignant
qui vous fait les , par exemple : dupouy@enst.fr
Le texte du sujet ( subject ) doit contenir le mot :
TPAST pour les AST maîtrises
TP1A pour les éléves de 1ère année


Documentation

Le support de cours sur les processus se trouve ici.

I.Utilisation des commandes du shell

Les exercices suivants s'attachent à montrer les différences entre processus et utilisateur et à mettre en évidence quelques points importants du système Unix.
  1. Pour constater la différence utilisateur/processus, on essaiera la séquence de commandes suivantes:
    who		(liste des utilisateurs connectés)
    who am i	(qui suis-je ...)
    ps -l		(liste des processus attachés au terminal)
    ps -edf         (liste  des processus présents sur le système)
    ps -axl	        (idem avec plus de détails)
     ou
    ps -ael         ...suivant le système utilisé
    
    On remarquera  les différents processus :
  2. Accès au système. Voir, en les listant avec les commandes ypcatou getent, le contenu des fichiers suivants :
  3. Envoi d'une commande en arrière plan (option &) : sleep n met le processus qui l'exécute en pause pendant n secondes.
    Envoyer la séquence suivante et observer la filiation des processus :
    ps -l	  (liste des processus attachés au terminal courant)
    sleep 20& (processus qui dort pendant 20s en arrière plan)
    sleep 30& (processus qui dort pendant 30s en arrière plan)
    ps -l 	  (pour voir la nouvelle configuration de processus et constater
               que le processus qui exécute le shell a plusieurs
               processus fils, chacun faisant tourner le programme sleep)
    
  4. Effet de la commande exec.
    1. Faire : exec ps
      que se passe-t-il et pourquoi ?
      Indication : pour exec, comme pour quelques autres commandes (built-in commands) le shell ne créée pas de nouveau processus, c'est à qu'il ne fait pas appel à fork (cf. man exec).
    2. Travailler dans une nouvelle fenêtre,
    3. Entrer maintenant la commande : zsh,
    4. Relever le numéro du processus qui fait tourner ce nouveau shell courant (en faisant ps -l),
    5. Faire maintenant : exec ps -l.
      Relever le pid du processus qui exécute ce programme ps -l.
      Quelle est sa valeur et pourquoi  ?

II.Introduction aux exercices en C

Créer un répertoire appelé TPProc dans lequel vous travaillerez :
cd                            Pour aller dans le home directory           
mkdir TPProc
cd TPProc

Par la suite, pour compiler les fichiers et créer les exécutables, utiliser la commande gcc.
Par exemple (premier exercice) :

gcc exo1.c -o exo1
ou, mieux :
gcc -Wall exo1.c -o exo1

Sur une machine multi-processeur on peut avoir à forcer l'exécution sur un seul processeur, dans ce cas il faut utiliser la commande taskset, par exemple :
taskset -c 0 ./exo1

III. Création de processus (fonction fork)

III.1 Fonctions utilisées

On va tout d'abord utiliser les fonctions UNIX suivantes :

III.2 Exercice 1

  1. Après compilation de exo1.c, on exécutera le programme exo1 plusieurs fois.
    Pourquoi cinq lignes sont-elles affichées alors qu'il n'y a que deux printf dans le programme ?
    Pour récupérer ce programme exo1.c, cliquer ici.
  2. Ajouter maintenant la ligne suivante derrière l'appel à fork :
    if (valeur == 0) sleep (4);
    Que se passe-t-il ? Pourquoi ?

III. 3 Exercice 2

Pour récupérer le programme suivant : fork-mul.c, cliquer ici.
Compiler fork-mul.c, puis l'exécuter.

Après exécution et à l'aide du schéma suivant, relever les numéros des processus et numéroter l'ordre d'exécution des instructions printf de façon à retrouver l'ordre d'exécution des processus.

Remarque:
si on relève un numero de processus égal à 1, il s'agit du processus init, père de tous les processus. Init adopte les processus orphelins, c'est à dire qu'un processus dont le père s'est terminé devient fils de 1, et getppid() renvoie 1.

IV.Synchronisation de processus père et fils (mécanisme wait/exit)

IV.1 Fonctions utilisées

La valeur de retour de wait est le numéro du processus fils venant de se terminer.
Lorsqu'il n'y a plus (ou pas) de processus fils dont il faut attendre la fin, la fonction wait renvoie -1.
Chaque fois qu'un fils se termine le processus père sort de wait, et il peut consulter Etat pour obtenir des informations sur le fils qui vient de se terminer.

Etat est un pointeur sur un mot de deux octets :

Schéma résumant le contenu du mot pointé par Etat à la sortie de wait :

IV.2 Mécanisme wait/exit

Compiler et exécuter fork-sync.c après l'avoir récupéré en cliquant ici.

V.Père et fils exécutent des programmes différents

V.1 Fonction utilisée

La fonction exec charge un fichier dans la zone de code du processus qui l'appelle, remplaçant ainsi le code courant par ce fichier. Une des formes de cette fonction est execl :

int execl (char *fic, char * arg0, [arg1, ... argn,])


Commentaires :

V.2 Fonctionnement de exec

Compiler puis exécuter le fichier fexec.c (il est ici).
Pour en vérifier le bon fonctionnement, on fera exécuter par execl un fichier très simple, par exemple celui dont le source est ci-dessous :

int main (void) { 
   printf("Bonjour, ici %d !\n", (int)getpid() );
   sleep (4);
   return 6;
}

On peut exécuter ce programme en lui passant diverses commandes en argument, par exemple, si l'exécutable s'appelle fexec :

VI. Exercice à rendre

D'après les exemples précédents, écrire un programme dont le fonctionnement est le suivant (compiler en utilisant l'option -Wall de gcc, il ne doit pas y avoir de warnings après la compilation)  :

Après avoir vérifié que le programme fonctionne correctement :


©(Copyright) dupouy@enst.fr