7.6 Les entrées-sorties
Structuration des fichiers Unix
-
Fichier Unix º séquence d'octets
- ( Fichiers spéciaux)
- Pas de structuration des fichiers au niveau du noyau
- Structuration possible des fichiers suivant les applications
- Exemple : les fichiers textes Unix
-
Leurs lignes se terminent par ``line_feed'' (
LF
)
- Le noyau Unix ne connaît pas cette convention
- Il pourrait manipuler des fins de lignes ``carriage_return'' et ``line_feed'' comme sous MS-DOS
Disques
-
Le ou les disques physiques
- Partagés en disques logiques (systèmes de fichiers)
- Montage des disques logiques
-
Disque monté ® accessible
- Disques démonté ® inaccessible
- Disques logiques
-
Composés de blocs (i.e. 512 ou 1024 octets)
- Premier bloc (adresse 0) : bootstrapping
- Second bloc (adresse 1) : super bloc
Taille du disque
Espaces disponibles
..., liste d'index
- 3e région : la i-liste, liste d'index
Contient les i-noeuds (i-nodes)
- 4e région : les fichiers proprement dits
Contient les données
- La racine d'un disque logique possède donc toujours le
i-node 2 :
% df /usr
Filesystem 512-blocks Used Avail Capacity Mounted on
/dev/rz3g 792124 664414 48496 93% /usr
% ls -lid /usr
2 drwxr-xr-x 21 root system 512 Nov 8 1995 /usr/
Les i-nodes
-
Code les caractéristiques d'un fichier
- 64 octets :
-
Numéro du propriétaire
- Numéro du groupe propriétaire
- Bits de protection (3 × 3 + set-uid + set-gid
+ sticky-bit)
- Numéros des blocs du contenu du fichier
- Taille du fichiers (en octets)
- Dates de création, dernière modification, et dernière
accès
- Type du fichier (ordinaire, répertoire, fichier
spécial...)
Accès aux données
Numéros des blocs du contenu du fichier
-
13 entrées (i.e. 13 adresses de blocs)
- Les 10 premières entrées : adresses des 10 premiers blocs du
fichier
5120 octets au maximum
- La 11e entrée : adresse d'un bloc
Ce bloc contient les adresses des 128 blocs suivants
70656 octets au maximum ((128 × 512) + 5120)
- La 12e entrée : idem la 11e , avec une indirection
supplémentaire
8.459.264 octets maximum ((128 × 128 × 512)
+ 70656)
- La 13e entrée : triple indirection
1.082.201.087 octets au maximum » 1 Go
Privilégie les accès aux fichiers de petite taille
Allocation des blocs d'un fichier sur un volume
Structure d'un répertoire
Un répertoire
-
Est un fichier
- Son contenu est un tableau
- Ce tableau contient des couples
-
Nom de l'entrée dans le répertoire (
char *
)
- Numéro d'i-node correspondant à cette entrée
- Deux premières entrées :
-
Le répertoire lui-même (
.
)
- Son père (
..
)
Appels système et bibliothèque standard
Appels système
-
Travail en zone système (cache des fichiers)
- Assure la cohérence des manipulations
La bibliothèque standard
-
Travail dans un buffer Î espace de données utilisateur
- Minimise le nombre d'appel au moniteur
- Donc le nombre d'interruption du processus
- Se charge des transferts entre le buffer et le noyau
- À utiliser dans le cas général
Les appels système
-
Deux types de référence à un fichier
-
Noms des fichiers (
char *
)
- Descripteur de fichiers (
int
)
- Ouverture : lien entre un nom du système de fichier et un
nom local dans le processus (un descripteur)
- Lecture et écriture dans un fichier
- Positionnement dans un fichier
- Définition de synonymie de descripteurs
- Connaissance/modification des caractéristiques d'un fichier
- Fermeture d'un fichier
Les descripteurs
-
Nombre maximal de descripteurs par processus
- ( Héritage des descripteurs du processus père)
- Trois descripteurs d'entrée-sortie standard
-
Entrée standard : descripteur 0
- Sortie standard : descripteur 1
- Sortie d'erreur standard : descripteur 2
- Ces 3 fichiers sont ouverts à la création du processus
- Ne doivent pas être ouvert par l'utilisateur
- Autres fichiers :
open()
retourne un
descripteur
Création d'un fichier
int creat (char *nom, int mode) ;
Ouverture d'un fichier
int open (char *path, int oflag, int mode) ;
Fermeture d'un fichier
int close (int idfi) ;
Contrôle des entrées-sorties
int fcntl (int idfi, int cmd, int arg) ;
Lecture dans un fichier
int read (int idfi, char *buffer, unsigned nbytes) ;
Exemple : afficher le contenu d'un fichier
int fil ; /* descripteur du fichier */
char buffer [513] ; /* buffer de lecture */
int l ;
main (int argc, char *argv[])
{
/* ouverture du fichier */
if ((fil = open (argv [1], 0)) < 0) {
perror ("open") ; exit (fil) ;
}
/* lecture et affichage */
for (;;) {
if (! (l = read (fil, buffer, 512))) break ;
buffer[l] = NULL ;
printf ("%s", buffer) ;
}
/* fermeture du fichier */
if (close (fil) {
perror ("close") ; exit (2) :
}
exit (0) ;
}
Écriture dans un fichier
int write (int idfi, char *buffer, unsigned nbytes) ;
Positionnement dans un fichier
int lseek (int idfi, long offset, int whence) ;
Établissement d'un lien avec un fichier
int link (char *nom1, char *nom2) ;
Destruction d'un lien ou d'un fichier
int unlink (char *nom) ;
Droit d'accès pour les créations
int umask (int compmode) ;
Changement des droits d'accès
int chmod (char *nom, int mode) ;
Contrôle des droits d'accès
int access (char *nom, int mode) ;
Changement de répertoire
int chdir (char *nomdir) ;
Duplication d'un descripteur
int dup (int idfi) ;
Structure d'un i-node
-
Différentes informations contenues dans un i-node
- Définition d'une
struct
C contenant ces informations :
Fichier /usr/include/sys/stat.h
struct stat {
dev_t st_dev; /* ID of device containing a directory*/
/* entry for this file. File serial*/
/* no + device ID uniquely identify */
/* the file within the system */
ino_t st_ino; /* File serial number */
mode_t st_mode; /* File mode */
nlink_t st_nlink; /* Number of links */
uid_t st_uid; /* User ID of the file's owner */
gid_t st_gid; /* Group ID of the file's group */
off_t st_size; /* File size in bytes */
time_t st_atime; /* Time of last access */
time_t st_mtime; /* Time of last data modification */
time_t st_ctime; /* Time of last file status change */
uint_t st_blksize; /* Size of block in file */
int st_blocks; /* blocks allocated for file */
};
Information sur un fichier ouvert
int fstat (int idfi, struct stat *buffer) ;
La bibliothèque
-
Notion de stream
- Fonctions
-
fopen ()
, fclose ()
, fread ()
, fwrite ()
,
fseek ()
...
getc ()
, fgets ()
, putc ()
, fputs ()
...
fprintf ()
, fscanf ()
...
- Voir le cours de C