Previous Up

6  Mes commandes Unix

Pour terminer ces travaux pratiques, nous allons implanter notre propre version de quelques commandes Unix bien connues.

Nous travallerons dans le répertoire mcu/, mes commandes Unix, de notre dépôt.

Un filtre est une commande qui lit un texte à traiter sur son entre standard (stdin), produit son résultat sur la sortie standard (stdout), et produit éventuellement des messages d’erreur — dans l’idéal sur la sortie d’erreur (stderr). De plus, un filtre retourne 0 s’il se termine correctement et un code d’erreur dans le cas contraire.

Pour faire simple, nous n’allons implanter que des filtres ne prenant aucune option et qui traitent l’entrée standard ligne par ligne. On convient que nos versions basiques de ces commandes considérent que les lignes font au plus 80 caractéres. Si l’entrée standard fournie contient une ligne de plus de 80 caractères, le filtre se termine sur un échec et le code d’erreur retourné est 1.

Nous allons implanter des versions simplifiées des commandes unix suivantes :

La compilation et la mise à jour des exécutables en fonction des évolutions du code se fera en utilisant la commande make. Vous devez donc construire le makefile correspondant au fur et à mesure des exercices.

6.1  Fonctions partagées

Nous allons commencer par coder des fonctions qui vont être utilisées dans plusieurs exécutables que nous devons implanter. Pour décrire ces fonctions, nous indiquons ci-dessous une partie des fichiers d’entêtes contenant leurs prototypes et des macros utiles :


Exercice 57
 (Implantation des fonctions partagées)   Implanter ces fonctions et assurez vous de leurs bon fonctionnement. Prenez soin à ce que chaque fonction soit dans un fichier source différent et que votre code fonctionne avec le fichier de test suivant : Sources/mcui_test.c pour produire le résultat suivant :
bash$ ./mcu_test < mcu_test.c ; echo "le code de retour est $?"
#include <stdio.h>
18
1==1 is true
le code de retour est 2
bash$
après la compilation :
bash$ make mcu_test
gcc  -c mcu_affiche_entier.c
gcc  -c mcu_fatal.c
gcc  -c mcu_readl.c
gcc  -c test.c
gcc  -o test mcu_affiche_entier.o mcu_fatal.o mcu_readl.o test.o
bash$

6.2  les commandes UNIX proprement dites


Exercice 58
 (commandes de comptage)   Les filtres mcu_wc et mcu_ww doivent fournir les résultats suivants sur ces exemples :
bash$ echo "Hello Unix World!" | ./mcu_wc
18
bash$ echo "Hello unix World!" | ./mcu_ww
3
bash$
Le filtre mcu_wc est très simple alors que le filtre mcu_ww nécessite plus de technique comme l’utilisation d’un automate simple.

Pensez à vérifier votre code. Par exemple :

bash$ echo "`wc -c < mcu_wc.c` - `./mcu_wc < mcu_wc.c`" | bc
0

Implanter les filtres mcu_wc et mcu_ww.


Exercice 59
 (commandes mcu_wl et mcu_rev)   Nous allons maintemant utiliser la fonction readl de la librairie standard pour implanter les filtres mcu_wl et mcu_rev. Vous devriez obtenir ce genre de résultat.
bash$ echo "Hello World," > essai
bash$ echo "Hello Unix World!" >> essai
bash$ ./mcu_wl < essai
2
bash$ ./mcu_rev < essai
,dlrow olleH
!dlroW xinU olleH
bash$

Implanter les filtres mcu_wl puis mcu_rec.


Exercice 60
 (commande uniq)   Implanter le filtre mcu_uniq décrit précédemment.

Exercice 61
 (commande mcu_xxd)   L’exécution de la commande mcu_xxd doit vous permettre d’obtenir ce genre de résultat (en utilisant le fichier créer dans l’exercice précédent).
bash$ ./mcu_xxd < essai 
00000000: 4865 6c6c 6f20 776f 726c 642c 0a48 656c  Hello world,.Hel
00000010: 6c6f 2055 6e69 7820 576f 726c 6421 0a    lo Unix World!.
bash$

Implanter le filtre mcu_xxd décrit précédemmment.

Indication.

Pour faire simple, vous pouvez lire les caractères et remplir un tampon (i.e. un tableau de caractères) en ajoutant au fur et à mesure les champs nécessaires. Lorsque ce tampon est plein, vous devez retourner ce tampon sur la sortie standard.


Previous Up