Exercice 1.
Ecrire un code C qui implémente la fonction de librairie
int
getchar (
void)
qui renvoie un caractère lu
sur l'entrée standard ou la constante EOF en fin de fichier.
Vous
ne devez utiliser que des primitives système.
Quel est la valeur de la constante EOF
?
Exercice 2.
Ecrire un code C qui implémente une version
bufferisée de la fonction de
librairie
int
getchar (
void)
(Les caractères lus sur l'entrée standard seront
stockés dans une zone tampon de taille MAXBUF (une constante
à définir). Un appel à
getchar ne renvoie qu'un seul
caractère et ne provoque un appel
à
read que lorsque le
tampon est vide, c'est-à-dire lorsque les MAXBUF
caractères du tampon ont déjà été
renvoyés.)
Exercice 3.
Ecrire
un code 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 avec
l'option
-l).
Exercice 4.
Ecrire
un code C qui prend en paramètre un nom de répertoire,
et qui
affiche tous les objets contenus dans ce répertoire. On prendra
les
mêmes conventions de restriction d'affichage que la commande
ls (pas d'affichage des noms
commençant par un point).
Exercice 5.
On
croit souvent que les primitives système étant de plus
bas
niveau, sont plus efficaces que les fonctions de
biliothè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.
- Le premier utilisera les fonctions de bibliothèque getchar et putchar.
- Le deuxième utilisera les primitives système read et write
et prendra en argument la taille du buffer utilisé pour la
copie. Si
cette taille vaut 1, la copie sera effectuée caractère
par caractère.
Vous utiliserez la commande UNIX
time
pour comparer les temps d'exécution, en considérant somme
des temps CPU en mode utilisateur et en mode système. Vous
effecturez 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 6.
Télécharger ce petit
lexique
qui contient tous les mots de 5 lettres. Ecrire un code 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).
Exercice 7.
Ecrire un programme qui affiche uniquement les 10 derniers
caractères d'un fichier dont le nom est donné en
argument. On écrira une version bufferisée où les
caractères du fichier sont lus par paquets de taille MAXBUF >
1.
Exercice 8.
Ecrire un programme qui change le contenu d'un fichier (dont le
nom est donné en argument) en convertissant les lettres en
majuscules. La conversion de minuscule en majuscule peut se faire
à l'aide de la fonction
toupper.
La modification est à faire
sur
place par paquets de taille MAXBUF.