Gestion des entrées/sorties: organisation d'un disque dur
Gestion des entrées/sorties: organisation d'un i-node (fichier) sur un disque Quelques types de systèmes de fichiers: FAT, VFAT (ancien windows et clés USB) NTFS windows actuel Ext, Ext2, Ext3 : linux UBIFS: linux embarqué ISO9600: CD-ROM NFS, SMB: système de fichiers partagés (réseaux)
Gestion des entrées/sorties: gestion de fichier dans le noyau linux (Appel system)
Gestion des entrées/sorties: organisation d'un file system linux Remarque: La commande "cd" permet de naviguer dans les répertoires et la commande "ls" permet de lister le contenu d'un répertoire. Le répertoire "./" représente le répertoire courant et le répertoire "../" représente le répertoire père Exemple: cd /media/usb ls ./ ls ../ cd /home/toto ls docs cd docs/cours
Gestion des entrées/sorties: montage file system Remarque: /dev/hda1 (Hard Disk 1: premier disque dur) représente le file system principale (root file system). Il contient l'arborescence principale. Sur cette arborescence vient se greffer d'autres file system tels que celui du CD ou une clé USB…les point où on vient greffer un autre file system s'appelle un point de montage Exemple: montage d'une clé USB Lorsqu'une clé USB est insérée sur un PC le driver "usb storage" la reconnais et crée un fichier représentant ce device dans le répertoire /dev (ex: /dev/sda1) Pour monter le système de fichier de la clé il faut: mkdir /media/usb mount -t vfat /dev/sda1 /media/usb
Gestion des entrées/sorties: montage automatique au démarrage Remarque 1: Au démarrage il n'existe que le point de montage racine (/) puis le noyau linux monte le root file system qu'il lui est passé en paramètre par le bootloader. Puis le processus Init analyse le fichier /etc/fstab dans le root file system pour savoir où trouver les autres file system à monter. Dans l'exemple ci-contre chaque ligne représente une commande de montage exécutée par le processus Init. Remarque 2: En général il existe un explorateur de fichier sous linux (pareil que windows). En plus d'explorer les fichiers, son rôle consiste aussi a détecter l'insertion d'un device contenant un file system (clé USB, CD…) reconnaitre sont type et le monter automatiquement (ceci vous évite de taper la commande mount à chaque fois que vous insérer une clé USB avant de pouvoir l'utiliser
Posix, gestion des entrées/sorties: fonction mount()
Posix, gestion des entrées/sorties: Manipulation de répertoires DIR* opendir(const char* chemin): ouverture d'un répertoire int closedir(DIR* repertoire): fermeture d'un répertoire struct dirent* readdir(DIR* repertoire): lecture d'une entrée d'un répertoire void seekdir(DIR* rep, long pos): positionnement dans un répertoire long telldir(DIR* rep): retourne la position courante dans le repertoire int chdir(const char *path): changement de répertoire int mkdir(const char *path, mode_t mode): création d'un répertoire int rmdir(const char *path): suppression d'un répertoire Question : Quelles entrées trouve t on à la position 0 et à la position 1 dans un répertoire ?
Posix, gestion des entrées/sorties: Les attributs d'un fichiers Exemple: La fonction stat: set à récupérer les attributs d'un fichier int stat(const char *path, struct stat *buf); Champs de la structure stat: st_dev, st_ino: périphérique et numéro du fichier st_mode: type et droits d’accès st_nlink: nombre de liens st_uid, st_gid: propriétaire et son groupe st_size: taille du fichier (nombre de caractères) st_atime: date du dernier accès st_mtime: date de la dernière modification st_ctime: date du dernier changement d’attributs
Posix, gestion des entrées/sorties: Manipulation des fichiers int open(const char *path, int oflag [, mode_t mode]): ouverture (possibilité de création) d'un fichier ssize_t read(int fd, void *buf, size_t n): lecture depuis un fichier préalablement ouvert ssize_t write(int fd, void *buf, size_t n): écriture dans un fichiers préalablement ouvert off_t lseek(int fd, off_t offset, int whence): positionnement dans un fichiers
LIBC, entrées/sorties Sur les systèmes de type UNIX, Les fonctions d'entrées/sorties de la bibliothèque standards de la LIBC sont implémentées à l'aide des primitives (fonctions) de l'API posix. Dans le cas de lecture/écriture d'un fichier, les fonctions de la LIBC (fread, fwrite) utilisent une bufferisation des données dans l'espace utilisateur afin de faire le minimum d'appel systèmes (read, write). Ceci à pour effet d'accélérer le traitement. Lorsqu'il faut effectuer des accès à des périphériques autres que le disque (ex: réseaux, ports…), il faut impérativement utiliser les appels posix et non ceux de la LIBC (standard)
LIBC, entrées/sorties: ouverture et fermeture d'un fichier File *file = fopen("nom-de-fichier","mode"); Les différents modes d'accès sont: "r" ouverture d’un fichier texte en lecture "w" ouverture d’un fichier texte en écriture "a" ouverture d’un fichier texte en écriture `a la fin "rb" ouverture d’un fichier binaire en lecture "wb" ouverture d’un fichier binaire en écriture "ab" ouverture d’un fichier binaire en écriture à la fin "r+" ouverture d’un fichier texte en lecture/écriture "w+" ouverture d’un fichier texte en lecture/écriture "a+" ouverture d’un fichier texte en lecture/écriture à la fin "r+b" ouverture d’un fichier binaire en lecture/écriture "w+b" ouverture d’un fichier binaire en lecture/écriture "a+b" ouverture d’un fichier binaire en lecture/écriture `a la fin fermeture : fclose(file);
LIBC, entrées/sorties: Les entrées sorties texte Ecriture formatée: int fprintf(File *file,"chaîne de contrôle",expression-1, ..., expression-n) Lecture formatée: int fscanf(File *file,"chaîne de contrôle",argument-1,...,argument-n) Lecture d'un caractère: int fgetc(FILE* file) Ecriture d'un caractère: int fputc(int caractere, FILE *flot)
LIBC, entrées/sorties: exemple, recopie d'un fichier texte
LIBC, entrées/sorties: Les entrées sorties binaires Lecture : size t fread(void *pointeur, size_t taille, size_t nombre, FILE *file) Ecriture: size t fwrite(void *pointeur, size_t taille, size_t nombre, FILE *file)
LIBC, entrées/sorties: Exemple écriture binaire
LIBC, entrées/sorties: Exemple lecture binaire
LIBC, entrées/sorties: positionnement dans un fichier int fseek(FILE *flot, long deplacement, int origine) Origine peut être l'une de ces constantes : SEEK SET (égale à 0) : d´ebut du fichier SEEK CUR (égale à 1) : position courante SEEK END (égale à 2) : fin du fichier La fonction long ftell(FILE *file) retourne la position courante
LIBC, entrées/sorties: Exemple positionnement dans un fichier
LIBC, entrées/sorties: Exemple positionnement dans un fichier (suite) L’exécution de ce programme affiche à l’écran : position 200 position 160 i = 40 position 0 i = 0 position 24 i = 6 Question : Que manque t il dans le code de ce programme ?