TP3 - Programmation système (M3101-1) SE TP UE31

Création de processus - variables d'environnement

 

 

Exercice 1 : un peu de généalogie

Examinez le programme mesForks.c (vieille version mes_fork.c). Essayez d'abord de deviner ce qu'il va afficher. Ensuite, compilez-le et exécutez-le.
Dans votre rapport, vous donnerez :

  • la sortie obtenue,
  • le nombre de processus créés par ce programme,
  • leur arbre généalogique (vous pourrez utiliser la commande pstree).

Modifiez le code afin d'observer des zombies (utiliser sleep()). Vous pourrez les observer avec la commande ps aux.

 

Exercice 2 : écriture d'un shell basique

Écrivez un programme shell1 implémentant les fonction basiques d'un interpréteur de commande (« shell »). Ce programme boucle sur les trois actions suivants :

  1. affichage d'un message d'invite,
  2. saisie d'une commande,
  3. exécution de la commande saisie,

jusqu'à ce que l'utilisateur saisisse le caractère fin de fichier (CTRL+D) ou la commande spéciale exit.

Remarques :

  • Votre programme devra créer un nouveau processus pour chaque commande à exécuter.
  • Votre programme ne devra pas créer de zombies...
  • Si la commande saisie n’existe pas, votre programme devra afficher un message d’erreur approprié.
  • Si la commande est vide (l’utilisateur a simplement tapé « entrée »), alors votre programme devra simplement ré­-afficher l'invite de saisie, sans afficher de message d’erreur.
  • Pour saisir une commande, et la découper en « mots », vous pouvez utiliser la fonction lis_ligne() ( ligne_commnde.c ligne_commande.h) spécifiée dans le fichier fournit ici.

Vous aurez besoin des appels systèmes fork(2), waitpid(2) et execvp(3).

 

Exercice 3 : gestion de l'environnement dans le shell

Rappel : Tout processus possède un _environnement_ : c'est une liste de variables possédant un nom (traditionnelle­ment en majuscules) et une valeur (chaîne de caractères). Cet environnement peut être affiché par la com­mande env. Comme toutes les propriétés d'un processus, l'environnement du processus père est copié pour chaque processus fils (c'est ainsi que la commande env permet d'afficher l'environnement du shell qui l'a lancé...).

Écrivez un programme shell2, basé sur celui de l'exercice précédent, pourvu d'une commande interne permettant de modifier sont environnement. Cette commande prendra la forme

    export NOM=valeur


NB: vous pourrez utiliser la fonction separe_egal spécifiée dans le fichier ligne_commande.h.

Par ailleurs, vous modifierez votre shell pour que, si la variable d'environnement INVITE est définie, c'est sa valeur qui sera affichée en guise d'invite.

Vous aurez besoin des appels systèmes getenv(3) et setenv(3).

Dans votre rapport, vous expliquerez pourquoi la commande export doit être implémentée comme une commande interne (c.à.d. à l'intérieur du shell) et non comme une commande externe (un programme lancé par le shell).