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