Exercice 1

En ligne de commande, créez un tube nommée. Servez vous en pour afficher le contenu d’un fichier depuis un autre terminal ; i.e., ouvrez deux onglets l’un des deux affiche, l’autre sert à “envoyer” le texte.

  • Fermez un programme.
  • Recommencez et fermez l’autre
  • Recommencez et supprimiez le tube

Exercice 2

On souhaite écrire un programme: my-pipe cmd1 [liste d'arguments] -- cmd2 [list d'arguments] qui effectue l’équivalent de la commande shell |.

Il s’agit ici d’utiliser un tube pour relier la sortie de la commande cmd1 à l’entrée de la commande cmd2.

  • Tester votre programme avec mypipe ls -- wc -l (équivalent de ls | wc -l).

  • Faire en sorte que la commande my-pipe retourne la valeur de sortie de la première commande lorsque celle-ci n’est pas nulle et celle de la seconde autrement.

  • Prendre en compte la terminaison anticipée de cmd2. Tester votre programme avec mypipe dmesg -- more en appuyant sur la touche q pour quitter le programme more.

Remarque: Vous pouvez devez utiliser un appel-système de la famille exec, mais pas system.

Exercice 3

On souhaite disposer d’une commande log grâce à laquelle on pourrait exécuter un programme quelconque en récupérant automatiquement une copie de sa sortie standard dans un fichier. En quelque sorte, il s’agit de dédoubler chacun des caractères envoyés sur sa sortie standard : un exemplaire est reproduit sur la sortie standard par défaut alors que l’autre est enregistré dans un fichier.

Le programme log prend en premier argument le nom du fichier à utiliser pour la sortie. Les arguments suivants constituent la commande à exécuter :

  • Pour réaliser le dédoublement de la sortie standard d’un processus, une solution est de rediriger sa sortie standard vers un tube à l’extrémité duquel un second processus pourra alors facilement extraire tous les caractères et les sauver dans un fichier en même temps qu’il les affichera sur sa sortie standard. Le programme log va donc créer un processus fils et un tube partagé par le père et le fils. Le fils, par exemple, pourra exécuter la commande spécifiée en paramètre, tandis que le père se chargera de l’affichage et de l’écriture dans le fichier. Donnez le code complet du programme log en utilisant autant que possible des fonctions d’entrée/sortie de haut niveau.

  • Une solution plus modulaire serait d’utiliser un programme intermédiaire (que l’on appelera tee) dont la tâche serait simplement de lire son entrée standard et de la reproduire à la fois sur la sortie standard et dans un fichier dont le nom serait passé en paramètre. Écrire tee.

$ echo Salut a tous | tee toto
Salut a tous
$ cat toto
Salut a tous
  • En utilisant tee, donnez une version plus simple du programme log.

sha1stream

./sha1stream < sha1stream.c

Écrire un programme sha1stream qui copie son entrée standard sur sa sortie standard, et qui affiche en fin de flot, sur la sortie d’erreur la somme de contrôle (md5/sha1) du flot qu’elle vient de copier.

Amélioration : Nous ne voulons pas du texte après la somme de contrôle, le faire disparaître

  • Ce programme nécessite 1 tube, un pour “nourrir” sha1stream
  • Pour l’amélioration, il faut un second tube pour récupérer la sortie de sha1stream