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 :
- affichage d'un message d'invite,
- saisie d'une commande,
- 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 (traditionnellement en majuscules) et une valeur (chaîne de caractères). Cet environnement peut être affiché par la commande
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 commandeenv
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).