Programmation Système
TP n° 1
(Gestion de fichiers)




Notions abordées :



Exercice 1.

Utiliser les primitives systèmes pour écrire un programme C qui affiche le contenu d'un fichier de caractères (dont le nom est donné en argument) mais en convertissant les lettres en majuscules. La conversion de minuscule en majuscule peut se faire à l'aide de la fonction de bibliothèque toupper(). Proposer une version où la lecture dans le fichier et l'écriture sur la sortie standard se font par bloc de 256 octets. Exemple d'exécution :

$ cat toto
Bonjour!
$ ./a.out toto
BONJOUR!
$



Exercice 2.

Ecrire deux programmes C : le premier programme crée un fichier binaire contenant une liste de 10 entiers (de type int). On utilisera la fonction de bibliothèque scanf() avec le format %d pour saisir les entiers au clavier. Le deuxième programme affiche la liste des entiers stockés dans le fichier. On utilisera la fonction de bibliothèque printf() avec le format %d pour afficher les entiers à l'écran.


Exercice 3.


Utiliser les primitives système pour écrire un programme C qui crée un fichier d'une certaine taille (peu importe le contenu). Le nom du fichier et la taille en octets sont donnés sur la ligne de commande. Exemple d'exécution :

$ ./a.out toto 2000
$ ls -l toto
-rw-r--r--  1 violard  staff  2000  9 sep 14:52 toto
$


Exercice 4.

Le but de cet exercice est de réaliser la fonction getchar() de la bibliothèque standard des E/S en utilisant la primitive système read() : On souhaite définir une fonction getchar2() qui a exactement le même profil que getchar() et se comporte exactement de la même façon. On procédera de la manière suivante :


Exercice 5.

Ecrire un programme C qui affiche en clair le type du fichier demandé (répertoire, fichier ordinaire, etc...), ainsi que ses permissions (lecture, écriture et exécution sous la même forme que la commande ls -l). On utilisera la primitive stat(). Exemple d'exécution :

$ ./a.out toto
toto    type : fichier normal    protections : rw-r--r--
$



Exercice 6.

On croit souvent que les primitives système étant de plus bas niveau, elles sont plus efficaces que les fonctions de bibliothèques équivalentes. On désire confirmer ou infirmer cette proposition par l'expérimentation.

Pour cela, on demande de rédiger deux programmes pour copier l'entrée standard sur la sortie standard.
Vous utiliserez la commande UNIX time pour comparer les temps d'exécution, en considérant la somme des temps CPU en mode utilisateur et en mode système. Vous effectuerez ces tests pour la copie d'un fichier d'au moins 10Mo.

En prenant comme taille de buffer les puissances successives de 2 (1, 2, 4, 8, ..., 1024) à partir de quelle taille de buffer est-il plus intéressant d'utiliser les primitives système que les fonctions de bibliothèque ?


Exercice 7.


Ecrire un programme C qui inverse un fichier de caractères : le programme affiche les caractères à l'envers en commençant par le dernier jusqu'au premier caractère contenu dans le fichier. On utilisera la primitive lseek(). Exemple d'exécution :

$ cat toto
Bonjour!
$ ./a.out toto

!ruojnoB$



Exercice 8.

Télécharger ce petit lexique qui contient tous les mots de 5 lettres. Ecrire un programme C qui prend un mot de 5 lettres en argument et qui détermine si ce mot appartient au lexique. Pour accélérer la recherche, on procédera par dichotomie (en se servant de la primitive lseek()).