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.
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 passystem
.
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
log
.
./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
sha1stream
sha1stream