Programmation syst`eme TP n 2 : Les processus

publicité
Programmation système
TP n◦2 : Les processus
Un peu de généalogie
Récupérez le programme “mesforks.c”. Compilez-le, exécutez-le... et répondez aux questions suivantes :
— Combien de processus sont-ils créés lors de l’exécution de ce programme ?
— Quels sont leurs liens de parenté ?
(dessinez l’arbre généalogique de tous les processus créés par ce programme)
— Observez l’ordre d’affichage sur plusieurs exécutions ? Que constatez-vous ? Qu’en déduisez-vous par rapport
au comportement de la fonction printf ? de l’ordonnancement des processus ? Quel impact sur vos pratiques
de debuggage ?
Votre Shell 1 : version interactive, exécution de commandes externes
Ecrivez un programme qui simule le comportement d’un interpréteur de commandes Shell : ce programme boucle
à l’infini sur les deux actions suivantes :
1. Saisie d’une commande
2. Exécution de la commande saisie
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 tapé retour-chariot), alors votre programme devra simplement
réafficher le prompt de saisie, sans afficher de message d’erreur.
— Pour saisir une commande, et la découper en “mots”, vous pouvez utiliser la fonction ligneCommande() qui
se trouve dans le fichier “ligneCommande.c”.
Votre Shell 2 : environnement
Tout processus possède un environnement qui est une liste de variables possédant un nom (traditionnellement en
majuscules) et une valeur (chaı̂ne de caractères). Cet environnement peu être affiché par la commande env .
Comme toutes les propriétés d’un processus, l’environnement est hérité par les processus fils.
On vous demande de modifier votre interpréteur de commande de sorte que, si la variable d’environnement INVITE
est définie, c’est sa valeur qui sera affichée en guise d’invite.
Afin de pouvoir modifier l’invite (ou n’importe quelle variable d’environnement) en cours d’utilisation, on vous
demande de faire en sorte que, lorsque la ligne de commande commence par le mot setenv , les deux arguments
suivants soient interprétés comme un nom de variable d’environnement et sa valeur. Vous devez alors créer ou
modifier la variable d’environnement correspondante.
Votre Shell 3 : tâches de fond
En Shell, on peut lancer une commande en tâche de fond, en particulier lorsque l’on ne souhaite pas monopoliser
l’interpréteur pour cette commande, et que l’on veut pouvoir lancer d’autres commandes en parallèle. Pour cela,
on fait suivre la ligne de commandes d’un “&”.
Il s’agit maintenant d’intégrer cette fonctionnalité à votre programme :
— Lorsque la ligne de commande saisie commence par le mot “tf” (tâche de fond), alors la commande suivant
tf sera lancée dans un nouveau processus, mais votre programme n’attendra pas la fin de l’exécution et il
réaffichera immédiatement le prompt de saisie pour saisir et exécuter la commande suivante.
1
— Lorsque la ligne de commande saisie ne commence pas par le mot “tf”, la commande correspondante sera
exécutée, et votre programme attendra la fin de l’exécution pour réafficher le prompt de saisie.
— Lorsqu’une commande lancée en tâche de fond se termine, votre programme affichera un message indiquant
la fin du processus (avec son numéro de pid).
Attention encore à ne pas créer de zombies...
Votre Shell 4 : redirection d’entrées/sorties
On souhaite à présente être capables de rediriger les entrées et les sorties de notre shell, à la manière de bash avec
> et <.
Vous allez donc ajouter cette dernière fonctionnalité à votre programme, en utilisant deux mots clés :
— from, qui sera suivi du nom du fichier dans lequel votre interpréteur lira ses commandes ;
— to, qui sera suivi du nom du fichier dans lequel votre interpréteur écrira sa sortie.
2
Téléchargement