Précédent Remonter Suivant

3  cnthole : comptage de fichiers creux

L'utilisation des fichiers Ă  accĂšs direct permet le positionnement du curseur (position courante) dans le fichier au delĂ  de la fin du fichier. Le « trou Â» laissĂ© au delĂ  de l'ancienne fin de fichier par ce dĂ©placement contenant exclusivement des zĂ©ros. L'implĂ©mentation habituelle est de ne pas Ă©crire ces zĂ©ros sur le disque, on parle de « fichiers creux Â».

Plus prĂ©cisĂ©ment les fichiers sont allouĂ©s sur le disque sous la forme d'une suite de blocs de caractĂšres. La taille BLKSIZE de ces blocs est donnĂ©e par le champ st_blksize de la structure struct stat retournĂ©e par les appels stat(), lstat(), et fstat(). Pour chaque bloc, l'adresse du premier octet est un multiple de BLKSIZE. GĂ©nĂ©ralement, on Ă©vite d'allouer les bloc plein de zĂ©ros, c'est-Ă -dire les blocs qui contiennent BLKSIZE octets nuls. Dans la suite, on appellera « trou Â» un bloc plein de zĂ©ros non allouĂ©.

On désire écrire une commande cnthole :
cnthole filename...
permettant de connaßtre combien de blocs seraient gagnés si les fichiers désignés par les arguments étaient constitués d'autant de trous que possible.

Dans ses grandes lignes, la commande cnthole consiste, pour chacun des fichiers de la ligne de commande, à Cette commande sera implantée par des appels successifs à la fonction
static int cnt_hole(int fd);
retournant le nombre de blocs pouvant ĂȘtre gagnĂ©s pour le fichier correspondant au descripteur fd. Cette fonction retourne -1 en cas d'erreur.

On fournit la fonction utilitaire suivante :
int bnull(const void *b, size_t len); 
qui retourne vrai si et seulement si les len octets Ă  partir de l'adresse b sont nuls.

Exercice 5
   Donnez les dĂ©clarations et le code du dĂ©but de la fonction cnt_hole() consistant en l'initialisation d'une variable BLKSIZE.


Exercice 6
   Donnez le code de la boucle principale de la fonction cnt_hole() itĂ©rant sur les lectures du fichier source pour compter les blocs de zĂ©ros.


Exercice 7
   Donnez le code de la fonction main() de la commande cnthole itĂ©rant sur les paramĂštres de la ligne de commande et rĂ©alisant l'ouverture du fichier, l'appel Ă  cnt_hole(), la fermeture du fichier et l'affichage du rĂ©sultat.


Exercice 8
   La commande cnthole proposĂ©e ne calcule pas combien de blocs pourraient ĂȘtre gagnĂ©s pour un fichier, mais plus prĂ©cisĂ©ment combien de blocs seraient gagnĂ©s entre les deux implantations du fichier : Ce qui est diffĂ©rent, en particulier pour un fichier comportant dĂ©jĂ  des trous.

Donnez les grandes lignes d'une commande qui fournirait effectivement le nombre de blocs pouvant ĂȘtre gagnĂ©s pour un fichier donnĂ©.


Précédent Remonter Suivant