Académique Documents
Professionnel Documents
Culture Documents
1. Définition
Les processus accèdent aux fichiers par un ensemble d'appels Systèmes en spécifiant
un fichier par une chaîne de caractères qui constitue le chemin d'accès.
Remarque:
L'i-noeud ne spécifie pas le chemin d'accès au fichier.
Changer le contenu d'un fichier implique automatiquement un changement dans
l'i-noeud, mais pas l'inverse.
tout fichier a un i-noeud (index node), mais peut avoir plusieurs noms, chaque nom
étant en relation avec l'i-noeud. Chaque nom est appelé un lien.
Quand un processus crée un nouveau fichier, le noyau lui assigne un i-noeud inutilisé.
Les i-noeuds sont rangés dans le système de fichiers, mais le noyau les lit et les mémorisent
dans une table des i-nœuds lorsqu'il manipule les fichiers.
Le noyau contient deux autres structures de données, la table des fichiers ouverts et la
table des descripteurs de fichier utilisateur.
La table des fichiers ouverts est une structure globale du noyau, mais la table des
descripteurs de fichier utilisateur est allouée pour un processus.
Ces trois tables, construites en mémoire volatile, entretiennent l'état du fichier et son
accès par les utilisateurs. Elles permettent à divers degré de partager l'accès à un fichier.
La table des fichiers préserve le déplacement octet dans le fichier d'où le prochain
read ou write utilisateur débutera, ainsi que les droits d'accès permis au processus qui fait
l'open.
#include <unistd.h>
int dup(int fildes);
Recherche le plus petit descripteur disponible en fait un synonyme du descripteur fildes les deux
descripteurs partagent la même entrée dans la table des fichiers ouverts du système. Écrire (/lire)
dans ce plus petit descripteur revient à écrire (/lire) dans le fichier référencé par fildes.
NB : Ce plus petit descripteur correspond à un fichier qui vient d’être fermé
#include <unistd.h>
int dup2(int fildes, int fildes2);
static void
print_inode(const char* str, int fd)
{
struct stat st;
fstat(fd, &st);
fprintf(stderr, "\t%s : inode %d\n", str, st.st_ino)
}
int
main(int argc, char* argv[])
{
int fdin, fdout;
fdin = open(argv[1], O_RDONLY);
fdout = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 666);
dup2(fdin, STDIN_FILENO);
dup2(fdout, STDOUT_FILENO);
Le i-node est representé au niveau programmation par une structure de donnée : stat.
stat() : renvoie les informations sur le fichier désigné par le lien symbolique
Système de fichiers et entrées/sorties
Page 4 sur 9
lstat() : renvoie les informations sur le lien lui-même.
struct stat {
dev_t st_dev;
ino_t st_ino;
...
struct stat {
...
nlink_t st_nlink;
...
Type et droits
Type
- Afin de déterminer le type du fichier, il est possible d’utiliser des macros sur le champ st_mode
Droits
#include <unistd.h>
int access(const char* path, int a_mode);
exemple:
if (! access(pathname, X_OK))
printf("Fichier exécutable\n");
#include <sys/stat.h>
int chmod(const char* path, mode_t mode);
spécification de mode sous forme d’un masque binaire (S_IRUSR, S_IWUSR, S_IXUSR, etc.)
Fichiers et répertoires
Fonctions de lecture
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *dirpath);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
int rewinddir(DIR *dirp);
Manipulations de répertoires
Création/destruction de répertoires
#include <sys/types.h>
#include <sys/stat.h>
int mkdir(const char *path, mode_t mode);
int rmdir(const char *path)
Remarques :
- mode ne doit contenir que des droits d’accès.
- On ne peut détruire qu’un répertoire vide
Exemple
mkdir("foo", S_IRUSR|S_IWUSR|S_IRGRP);
#include <unistd.h>
int link(const char *oldpath,const char *newpath);
int unlink(const char *path);
int rename(const char *oldpath, const char *newpath);
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *path, int oflag [, mode_t mode]);
Flag oflag
Exemple
if (open("foo", O_WRONLY|O_CREAT|O_TRUNC,
S_IRUSR|S_IWUSR|S_IRGRP) < 0) { /* rw- r-- --- */
perror("open");
}
Lecture/écriture séquentielles
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t n);
ssize_t write(int fd, void *buf, size_t n);
E/S séquentielles
Le pointeur d ’E/S est avancé du nombre de caractères effectivement transférés
Système de fichiers et entrées/sorties
Page 8 sur 9
Par défaut, read() est bloquant ; write()peut l’être
Valeur de retour
Nombre de caractères effectivement transférés
Pour read(), valeur de retour 0 ⇒fin de fichier
char buffer[MAX];
int n;
int fdin = open("foo", O_RDONLY|O_EXCL);
int fdout = open("bar", O_WRONLY|O_TRUNC|O_CREAT, …);
while((n = read(fdin, buffer, MAX)) > 0)
write(fdout, buffer, n);
if (n == 0) /* eof */
else /* n == -1 => erreur */
Accès direct
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
lseek(fd, 0, SEEK_SET);