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

Redirection, tâches de fond, et pipe.

 

 

Conseil préliminaire

Dans ce TP, on ne vous fournit pas de fichier Makefile. C'est à vous de l'écrire (voir avec votre enseignant pour un petit cours en début de séance).

 

Exercice 1 : redirection de la sortie standard

Un shell classique permet de rediriger les entrées/sorties standards vers d'autres fichiers, en utilisant les ca­ractères spéciaux < et >. Vous devez d'abord tester ces fonctionnalités dans votre shell (>, >>, 2>, 2>> et <). Ces fonctionnalités sont implementées au niveau du shell. Celui-ci recherche ces caractères spéciaux avant de lancer la commande. Il effectue la redirection et supprime ces caractères spéciaux (ainsi que ce qui est à leur droite) lors du passage des arguments à la commande. Cependant, notez que ces fonctionnalité n'ont pas besoin d'être interne au shell : elles peuvent être implantées avec une syntaxe différente, comme une commande externe.

On vous demande d'intégrer ces fonctionnalités à votre shell (TP 3).  Vous devrez tester avec une commande qui prenne au minimum deux arguments :

uneCommande unArgument > nomDeFichier

par exemple

  ls toto.txt > out.txt

Votre shell doit ouvrir en écriture le fichier dont le nom lui est passé après la redirection (out.txt dans l'exemple ci-dessus), et redirige sa propre sortie standard vers ce fichier, à l'aide de la fonction dup2(2) ou dup(2). Ensuite, il exécute la commande passée en première argument (ls dans l'exemple), en lui passant tous les arguments suivants le cas échéant (toto.txt dans l'exemple).

Notez que si le fichier n'existe pas (out.txt), il doit être créé ; s'il existe, son contenu doit être remplacé.

On notera que le paramètre argv de la fonction main respecte le format attendu par la fonction execvp(3) : il se termine par un pointeur NULL.

 

Exercice 2 : redirections généralisées¶

En partant du programme de l'exercice précédent, vuos devez prendre en compte les redirections suivantes:

  • >> redirection de la sortie standard en mode ajout
  • 2> redirection de la sortie erreur (vous pourrez tester avec ls fichierQuiNexistePas.txt)
  • 2>> redirection de la sortie erreur en mode ajout
  • < redirection de l'entrée standard (vous pourrez tester avec cat: cat < fichier.txt)

 

Exercice 3 : tâches de fond

Dans un shell classique, on peut lancer une commande en tâche de fond, en particulier lorsque l’on ne souhaite pas mono­poliser 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 commande d’un &.

 

Il s’agit maintenant de rajouter cette fonctionnalité à votre shell, basé sur le shell de l'exercice précédent ou celui du TP3 pour simplifier. Lorsque la ligne de commande saisie finit par & (tâche de fond), alors la commande sera lancée dans un nouveau processus (fonctionnement normal), mais votre shell n’attendra pas la fin de l’exécution et il ré­affichera immédiatement l'invite de saisie pour saisir et exécuter la commande suivante.

Lorsque la ligne de commande saisie ne finit pas par le caractère &, la commande correspondante sera exécutée, et votre programme attendra la fin de l’exécution pour ré­afficher l'invite de saisie (même com­portement que dans le TP3).

Attention encore à ne pas créer de zombies...

Vous ferez en sorte que, lorsqu’une commande lancée en tâche de fond se termine, votre shell affiche un message indiquant la fin du processus (avec son numéro de pid). Testez avec le shell (le vrai) pour voir le comportement attendu (avec "sleep 5 &" par exemple).

Exercice 4 : Tubes (pipes)

Vous devez apporter une dernière amélioration à votre shell: la gestion des tubes (pipes en anglais). Il s’agit de rediriger la sortie standard d’une première commande sur l’entrée standard d’une deuxième commande, mais pour que la communication puisse avoir lieu il vous faudra utiliser un tube entre ces deux entrées-sorties. Vous pourrez tester le bon fonctionnement de votre shell avec la commande:

                       monPrompt$ cat fichier | wc –l

L'appel système à utiliser est: pipe(2).