Skip to content

Programmation Système - E/S bas niveau⚓︎


Manipuler des fichiers⚓︎

Le but est de savoir manipuler tous les fichiers quels que soient leur type.
Ainsi nous sauront aussi bien gérer un fichier ASCII ou un Pipe depuis notre code C 😉 !

Nous allons nous intéresser aux fonctions suivantes :
- open : ouverture
- read : lecture
- write : écriture
- close : fermeture
- lseek : positionnement

Il faudra ajouter les includes suivants :

1
2
#include <fcntl.h>
#include <sys/types.h>    

Descripteurs de fichiers⚓︎

Ils sont utilisés pour désigner le fichier dans les opérations: open, read, write, close ...
C'est le nom local du fichier dans le processus.

On dispose de 20 descripteurs seulement pour chaque processus (0 .. 19) dont 3 descripteurs alloués automatiquement :
– 0 entrée standard
– 1 sortie standard
– 2 sortie erreur

De plus, un curseur (pointeur) dans le fichier est associé à chaque descripteur.
Ce curseur se deplace lors des léctures/écritures et peut être déplacé.
Cela permet d'aller lire ou écrire uniquement certains octets !


Primitives⚓︎

Open⚓︎

Permet d'ouvrir un fichier afin de la manipuler.
C'est la seule primitive qui utilisera la nom du fichier pour s'y référer, puis lui assignera un descripteur à utiliser dans les autres primitives.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
int open( char *path, int mode);
int open( char *path, int mode, int perm);

 path : chemin daccès au fichier
 mode ; mode douverture :
     O_RDONLY
     O_WRONLY 
     O_RDWR
     O_APPEND 
     O_CREAT
     O_TRUNC 
     etc ...

 perm : droits daccès du fichier en cas de création
 résultat : descripteur de fichier

Exemple⚓︎

1
2
3
4
5
int desc;
desc = open (" fichier ", O_RDONLY);

int desc;
desc = open (" fichier ", O_WRONLY|O_CREAT, 0666);

Write⚓︎

Permet d'écrire des données dans un fichier, en s'y référant par son descripteur.
Chaque écriture déplace le curseur dans le fichier (vers le bas).

1
2
3
4
5
6
7
int write (int desc, void *buf, int nboct);

 desc : descripteur de fichier
 buf : adresse de tampon des données à écrire 
 nboct : nombre doctets à écrire

 résultat : nombre doctets effectivement écrits, -1 en cas derreur

Exemple⚓︎

1
2
3
4
char ch[10]= "exemple"; 
int x = 1; 
write(desc,ch,sizeof(ch); 
write(desc,&x,sizeof(int));

Read⚓︎

Permet de lire des données dans un fichier, en s'y référant par son descripteur.
Chaque lecture déplace le curseur dans le fichier (vers le bas).
Pour lire une donnée, il faut donc que le curseur se situe au début de celle-ci avant de lire !

1
2
3
4
5
6
7
int read (int desc, void *buf, int nboct);

 desc : descripteur de fichier
 buf : adresse de tampon des données à lire 
 nboct : nombre doctets lus

 résultat : nombre doctets effectivement lus, 0 si fin de fichier, -1 en cas derreur

Exemple⚓︎

1
2
3
4
char ch[10]; 
int x, nb;
nb = read (desc, ch, 10);
nb = read (desc, &x, sizeof(int));

Close⚓︎

Permet la fermeture du fichier et la libération de son descripteur.

1
2
3
4
5
int close (int desc);

 desc : descripteur de fichier

 résultat : -1 en cas dechec, 0 sinon

Exemple⚓︎

1
close (desc);

Lseek⚓︎

Permet de déplacer manuellement le curseur dans un fichier.
On le deplacer d'un offset positif ou négatif (en octets), à partir de trois références :
- SEEK_SET : Le début du fichier
- SEEK_END : La fin du fichier
- SEEK_CUR : La position courante du curseur

1
2
3
4
5
6
7
int lseek (int desc, int offset, int whence);

 desc : descripteur de fichier
 whence : origine du déplacement -> SEEK_SET, SEEK_CUR, SEEK_END
 offset : valeur du déplacement en octet

 résultat : nouvelle position (en octets) depuis le début du fichier

Exemple⚓︎

1
int newPos = lseek(1, 4, SEEK_CUR);