Systèmes et Réseaux (SR1) - MIAGE 2
Systèmes d'exploitation

 

TP n°1 : Processus Unix

 

Objectifs : Introduction aux processus Unix, leur identification, leur environnement, leur création et synchronisation

  1. Rappels

  2. Identification des processus

  3. Environnement des processus

  4. Création de processus

  5. Synchronisation élémentaire de processus

  6. Exécution de programmes

 

1    Rappels

2     Identification des processus 

  1. Testez les commandes top et ps sur la machine que vous utilisez. Qu'effectuent-elles ?

  2. Ecrivez un programme qui affiche le numéro (PID) du processus qui l'exécute. Lancez ce programme plusieurs fois ; que remarquez-vous ?

  3. Modifiez ce programme pour qu'il affiche son PID et son PPID. Exécutez-le plusieurs fois ; que remarquez-vous  ?

3    Environnement des processus

  1. Testez la commande env pour afficher les valeurs des variables d'environnement courantes.

  2. Avec la commande echo, examinez en particulier la valeur de la variable PATH. Quelle est sa valeur ?
    Cette variable permet de localiser automatiquement un fichier exécutable (binaire) en définissant une suite de répertoires dans lesquels on recherche le programme exécutable, dans l'ordre d'apparition des répertoires. C'est ce qui permet, par exemple, à l'utilisateur de taper la commande gcc au lieu (par exemple) de /usr/local/bin/gcc.
    Pour connaître la localisation exacte d'une commande, on utilise which. Essayez, par exemple, which ls et which gcc. Quels sont les résultats obtenus ?

  3. Exécutez la commande setenv SAVEPATH $PATH (qui recopie dans la nouvelle variable d'environnement SAVEPATH la valeur courante de PATH). Puis exécutez setenv PATH /:. et tapez la commande ls. Que constatez-vous ? Comment l'expliquez-vous ?
    Pour restaurer la valeur de votre variable PATH, exécutez setenv PATH $SAVEPATH. Puis exécutez unsetenv SAVEPATH pour éliminer la variable SAVEPATH de votre environnement.

  4. Comment se fait-il que la commande setenv continue de fonctionner malgré la modification du PATH ?

 

4    Création de processus

  1. Ecrire un programme qui reproduit l'arbre généalogique ci-après. Chaque processus doit afficher son PID, son PPID et afficher les fils qu'il engendre.

     

  2. Que se passe-t-il si on lance plusieurs fois le programme ? (observez l'ordre d'apparition des messages à l'écran et commentez)

  3. On considère deux structures de filiation (chaîne et arbre) représentées ci-dessous. Ecrire un programme qui réalise une chaîne de n processus, où n est passé en paramètre de l'exécution de la commande (par exemple, n = 4 dans l'exemple donné). Faire imprimer le numéro de chaque processus et celui de son père. Même question avec la structure en arbre.

5    Synchronisation élémentaire de processus

  1. Modifiez le programme de la question 4.1 pour que le fils 2 affiche son message avant les fils 1 et 3.

  2. Modifiez ce programme pour que les petits-fils 1 et 2 affichent leur message avant les fils 2 et 3.

6    Exécution de programmes

La primitive execv permet de créer un processus pour exécuter un programme déterminé (qui a auparavant été placé dans un fichier, sous forme de binaire exécutable).

#include <unistd.h>
int execv(char* filename, char* argv[]);

Le paramètre filename pointe vers le nom (absolu ou relatif) du fichier exécutable, argv vers le tableau contenant les arguments (terminé par NULL). Par convention, le paramètre argv[0] contient le nom du fichier exécutable, les arguments suivants étant les paramètres successifs de la commande. (Voir aussi la primitive execve).

  1. Que fait le programme ci-dessous.
    #include <stdio.h>
    #include <unistd.h>
    #define NMAX 5
    int main() {
        char* argv[NMAX];
        argv[0] = "ls"; argv[1] = "-lt"; argv[2] = "/"; argv[3] = NULL;
        execv("/bin/ls", argv);
    }

  2. Ecrire un programme execcmd qui exécute une commande Unix passée en paramètre. Exemple d'exécution :
    execcmd /bin/ls -Ft /

  3. Ecrire un programme qui lance le programme de la question 2.3, en modifiant certaines variables d'environnement. Faire afficher ces variables par le programme. (utiliser la primitive execve).