Sunteți pe pagina 1din 4

M1 Informatique - Option Programmation Systme Partie Programmation Systme Universit Nice Sophia Antipolis

Ph. LAHIRE & L. PELLEGRINO Sujet ralis par Roger ROUSSEAU Anne universitaire 2011/2012

Sance de TP N1 01.entrees-sorties Traitement des erreurs et entres-sorties

Mthode de travail pour tous les TPs de cet enseignement


Cration du rpertoire de sance
Crez dans votre rpertoire personnel un rpertoire m1-programmation-systeme qui vous servira pour toutes vos activits dans cet enseignement. Pour chaque sance de TP, vous commencerez par crer un rpertoire de sance ~/m1programmation-systeme/nn.libell, avec nn le numro de la sance sur deux chiffres1 et libell un identificateur rsum mnmotechnique. Lidentificateur du TP est aussi indiqu dans le titre du sujet et sera utilis pour tous les documents fournis par les enseignants pour ce TP : fichiers de fourniture, corrig et sujet sur le site Web, etc. Donc, pour aujourdhui vous crez un rpertoire de sance ~/m1-programmation-systeme/01.entrees-sorties et vous vous placez sur ce rpertoire.

Dpliage de larchive de fourniture


Pour chaque sance, vous aurez rcuprer une archive en format .tar.bz2 que vous dplierez dans votre rpertoire de sance. Cette archive sera accessible partir dun lien donn par lenseignant. Elle contient des fichiers de programmes complter ou modifier, un script configure et un Makefile gnrique Makefile.gen. Il faudra toujours excuter, avant toute chose, le script configure qui produit le fichier Makefile prt lemploi, pour chaque TP, et en fonction de la machine UNIX utilise : LINUX, CYGWIN, SOLARIS, OSF/1, MAC OS/X (Darwin). Ces trois derniers systmes tant peu utiliss, le script configure et les bibliothques associes ne sont plus maintenues. Sil y a des petits problmes de portabilit des bibliothques ou des fichiers den-tte, il faudra vous-mme les adapter. Si vous devez modifier le Makefile, il faut toujours modifier le Makefile.gen (Makefile gnrique) et rexcuter le script configure.

Nettoyages de fin de sance


Pour viter davoir le disque satur, il faut prendre lhabitude de nettoyer son rpertoire de TP en fin de sance. Cela sobtient gnralement en excutant la commande make veryclean. De mme, il vaut mieux commencer un semestre en effaant tous les fichiers des annes ou des semestres prcdents qui sont compltement inutiles. En particulier, si vous avez un rpertoire /Library, vous pouvez leffacer sans scrupule. Les autres rpertoires peuvent tre utilement compresss aprs nettoyage. Il faut de temps en temps effacer vos rpertoires de caches de navigation Internet, et les fichiers fournis par vos enseignants que vous pouvez toujours rcuprer. Utilisez la commande du ~/* pour avoir une ide de votre occupation mmoire. Vous ne devriez pas occuper plus de 2 ou 3 Mo par fichier. La commande df ~ vous indique le taux doccupation du disque qui vous est attribu.
1

Pensez mettre un 0 en tte, si ncessaire, pour que les listages alphabtiques fonctionnent correctement.

M1 Informatique - Option Programmation Systme Partie Programmation Systme Universit Nice Sophia Antipolis

Ph. LAHIRE & L. PELLEGRINO Sujet ralis par Roger ROUSSEAU Anne universitaire 2011/2012

1. Recopie de fichier version 1


Recopiez dans votre rpertoire de sance larchive disponible ladresse http://goo.gl/yddyR et dballez-l. Ensuite crez un fichier tcopier1.c puis crivez une fonction void copierFichier1(int source, int destin) qui recopie dans un fichier destin le fichier source. destin et source sont deux descripteurs de fichiers ouverts dans le programme appelant dans les modes appropris pour la lecture ou lcriture. Cette fonction ne doit pas faire dhypothse sur la nature des mdias associs aux fichiers. Elle doit tester les comptes-rendus de tous les appels systme et ne comporter que des appels systme pour effectuer le traitement (pas les primitives de la bibliothque du langage C). On utilisera un tampon de taille BUFFSIZE=100 000 octets et la sortie de la fonction, celle-ci affichera la taille du tampon utilis, la taille du fichier lu et le nombre dappels systme pour la lecture du fichier source et lcriture du fichier destination. Dans cette version, le traitement des erreurs se fera en utilisant les primitives standard du systme Unix, comme la consultation de la variable errno et les primitives associes. Elle nutilisera pas (encore) les fonctions de Stevens ou les macros de Rousseau. Par contre, vous pourrez utiliser les primitives dentres-sorties du langage C (fprintf, ...) pour crire des messages sur la voie derreur. Ecrire un programme de test tcopier1 qui appelle cette fonction en ouvrant les fichiers source et destination partir de noms fournis sur la ligne de commande, avec la syntaxe : tcopier1 source destination. Par convention, si source ou destination sont des nombres, ils indiqueront un numro de voie dE/S de fichiers dj ouverts. Faire les tests suivants :
$ tcopier1 tcopier1.c fichier2 # Vous devez obtenir un rsultat similaire : Taille tampon: 100000 ; Taille fichier lu: 3837 ; Nb read: 1 ; Nb write: 1 $ wc tcopier1.c 108 493 3837 tcopier1.c $ diff tcopier1.c fichier2 # Il ne doit pas il y avoir de diffrences : $ cp Fourniture1/MOTS fichier1 $ tcopier1 fichier1 fichier2 # Vous devez obtenir le rsultat suivant : Taille tampon: 100000 ; Taille fichier lu: 1059314 ; Nb read: 11 ; Nb write: 11 $ tcopier1 0 fichier3 blablabla bliblibli <touche ^D> Taille tampon: 100000 ; Taille fichier lu: 20 ; Nb read: 2 ; Nb write: 2 $ cat fichier3 # Vous devez obtenir le rsultat suivant : blablabla bliblibli

2. Recopie de fichier version 2


Rcrire une version 2 du programme prcdent, mais en utilisant les macros de Rousseau pour le traitement des erreurs. Pour cela, utiliser le Makefile fourni, construit pralablement par le script

M1 Informatique - Option Programmation Systme Partie Programmation Systme Universit Nice Sophia Antipolis

Ph. LAHIRE & L. PELLEGRINO Sujet ralis par Roger ROUSSEAU Anne universitaire 2011/2012

configure. Ce Makefile fournit une cible principale qui construit un programme excutable crit en C en incorporant les fichiers de bibliothque de Stevens. Il faut aussi que votre programme commence par la ligne magique #include <stevens.h> car ce fichier den-tte dfinit (entre autre) les macros de Rousseau, et ralise toutes les inclusions de fichiers den-tte ncessaires aux TPs. Cette deuxime version utilisera un tampon de 10 000 octets seulement. On refera les mmes tests que pour la version prcdente et on comparera les rsultats avec ceux obtenus prcdemment.

3. Fichiers trous
Ecrire un programme write_a_hole qui cre un fichier de nom fichier-trou qui contient une ligne de texte, un trou de 100 000 octets puis une ligne de texte. (Rappel: le trou sobtient en dplaant le curseur dcriture au del de la fin de fichier). Excuter le programme write_a_hole. Constatez que le fichier fichier-trou a bien une taille de plus de 100 000 octets. Effacer le fichier fichier1 des questions prcdentes (dont la taille dpasse 1Mo). Avec les commandes :
$ du h . $ ls -ls fichier-trou

Excuter le programme write_a_hole . Constatez que le fichier fichier-trou occupe moins de 100 blocs de 1024 octets2. Remarque importante : Pour avoir un fonctionnement du systme de fichiers non biais par le montage NFS (montage dun disque sur une machine travers le rseau), il faut travailler sur un disque local la machine utilise. Dans le cas des machines du MIPS, cela peut sobtenir en crant un rpertoire du nom de lutilisateur sous /tmp :
$ mkdir /tmp/$USER $ cd /tmp/$USER

Les tests dexcution se feront sous ce rpertoire. Ne pas oublier en fin de sance de rcuprer dans votre espace utilisateur les sources des programmes dvelopps et deffacer ensuite /tmp/$USER.

2 Ce nest pas le cas sous Cygwin qui est implment au dessus de Windows, car le systme de fichier de Windows ne permet pas de traiter cela correctement.

M1 Informatique - Option Programmation Systme Partie Programmation Systme Universit Nice Sophia Antipolis

Ph. LAHIRE & L. PELLEGRINO Sujet ralis par Roger ROUSSEAU Anne universitaire 2011/2012

4. Recopie de fichiers avec trous


Ecrire une version tcopier3 de tcopier2 qui dtecte les trous dans le fichier source et les recre dans le fichier destination avec la primitive lseek(2). Ceci permet dviter dallouer des blocs pleins de 0 dans le fichier destination et gagne ainsi de la place sur le disque. Un bloc plein de zro est une suite de BLOCK_SIZE octets nuls dans le fichier source, dont ladresse du premier octet est un multiple de BLOCK_SIZE. BLOCK_SIZE est la taille dun bloc dallocation du systme de fichier et varie selon le type de systme. On peut connatre la taille en utilisant la primitive fstat (c.f. manuel de fstat(2)) ou la commande stat(1). Pour respective crire une suite de zro dans une chane de caractre et comparer deux chanes de caractre, vous pouvez utiliser bzero et bcmp.

Utilisation de lenvironnement des TPs sur son ordinateur personnel


Les consignes qui suivent sont raliser en dehors des sances de TP. Pour installer sur votre ordinateur lenvironnement utilis pour les TPs de cet enseignement, procdez comme suit. Crez un rpertoire m1-programmation-systeme sur votre machine sous votre rpertoire personnel, comme pour les machines du MIPS. Copiez larchive disponible ladresse http://goo.gl/DLJpC et dzippez la sous m1-programmation-systeme. Vous devriez ainsi avoir un dossier nomm misc dans m1-programmation-systeme. Dplacez vous dans le rpertoire lib contenu par misc et identifiez le rpertoire correspondant votre architecture. Une fois le rpertoire identifi, dplacez vous lintrieur et faites un make. Ceci va permettre de compiler la bibliothque libstevens.a adapte votre machine. Afin de gagner de la place pensez supprimer les sous-rpertoires du rpertoire lib qui ne correspondent pas votre architecture. Ensuite, crez sous m1-programmation-systeme des rpertoires de sance comme sur les machines du MIPS (01.entrees-sorties, etc.), et dpliez dans ces rpertoires les fournitures donnes pour les TPs. Vous devez galement modifier le fichier Makefile.gen en accord avec lemplacement du rpertoire lib.

S-ar putea să vă placă și