Traitement des fichiers spéciaux
Introduction aux fichiers spéciaux
Les fichiers jouent un grand rôle sous Linux (Everything is a file!)
Les fichiers spéciaux offrent l’accès aux :
- Données des périphériques d’entrées/sorties
- Accès séquentiel aux données des périphériques (binaire ou ASCII)
- Fichiers d’accès placés sous
/dev
(devfs) - Configuration du pilote et du périphérique
- Informations des périphériques, de leur pilote et des modules noyau
- Accès séquentiel aux données (ASCII)
- Fichiers d’accès placés sous l’arborescence
/sys
(sysfs) - Configuration et monitoring des pilotes de périphériques et des modules noyau
- Informations des processus et du noyau Linux
- Accès séquentiel aux données (ASCII)
- Fichiers d’accès placés sous l’arborescence
/proc
(procfs) - Configuration et monitoring des processus et du noyau Linux
La majorité des opérations utilisées sur les fichiers ordinaires peuvent s’appliquer aux fichiers spéciaux
Fichiers spéciaux - Architecture générale - Rappel
Everything is a file!
Devfs - Opérations sur les fichiers /dev
Devfs est un système de fichiers virtuels offrant l’accès aux données des périphériques. Cet accès est géré par des pilotes de périphériques.
Ces pilotes n’offrent normalement qu’un accès séquentiel aux données, c’est à dire, ces dernières ne peuvent être lues ou écrites que dans un flux continu sans saut aléatoire.
Opérations principales supportées par File-I/O
- Ouverture du fichier (accès au périphérique) →
open
- Lecture continue du contenu du fichier (périphérique) →
read
- Écriture continue dans le fichier (périphérique) →
write
- Lecture des métadonnées du fichier (périphérique) →
stat
- Fermeture du fichier (libération du périphérique) →
close
Les méthodes citées ci-dessus sont à celles appliquées sur les fichiers ordinaux et peuvent être utilisées de façon identique.
Il est cependant à remarquer que la méthode open
n’autorise pas la création
de fichiers d’accès aux périphériques. Cette opération est à exécuter avec
d’autres services du noyau Linux lors de l’installation du pilote de
périphérique.
Devfs - Lecture/écriture non bloquante
Contrairement aux fichiers ordinaires, il est très courant qu’un périphérique ne puisse accéder immédiatement à la requête souhaitée (lecture ou écriture). L’exécution de l’application est alors suspendue pendant un certain temps; par exemple sur une interface série en mode lecture, cette situation peut arriver si aucune donnée n’a été reçue.
Linux offre deux possibilités d’accès:
- Accès bloquant
- Accès non bloquant
À l’ouverture du fichier d’accès (open
), il est possible de choisir le type
d’accès. Si l’on souhaite un accès non bloquant, il suffit d’ajouter avec un ou
logique le fanion O_NONBLOCK
aux flags usuels.
Si l’accès non bloquant a été choisi, les méthodes read
et write
retourneront
le statut -1
avec errno
à EAGAIN
si le périphérique n’est pas accessible. Il
suffira alors simplement de resoumettre un peu plus tard la requête.
En cas d’accès bloquant, le processus sera tout simplement suspendu jusqu’à ce que le périphérique soit disponible.
Devfs - Lecture/écriture non bloquante - exemple
char buf[100];
ssize_t nr;
while (1) {
nr = read(fd, buf, sizeof(buf));
if (nr >= 0) break;
if (errno == EINTR)
continue; // --> read again
if (errno == EAGAIN)
break; // --> resubmit later
perror("ERROR");
break; // --> error: stop reading
}
if (nr > 0)
// à process read data
Sysfs - Opérations sur les fichiers /sys
Sysfs est un système de fichiers virtuels créé pour faciliter la configuration et
le monitoring de pilotes de périphériques. Des outils, tels que cat
ou echo
,
permettent d’accéder simplement aux informations stockées dans le sysfs.
L’échange d’information avec les fichiers sous sysfs se fait sous forme ASCII.
Opérations principales supportées par File-I/O :
- Ouverture du fichier (accès à l’attribut) →
open
- Lecture continue du contenu du fichier (attribut) →
read
/pread
- Écriture continue dans le fichier (attribut) →
write
/pwrite
- Positionnement dans le fichier (attribut) ->
lseek
- Lecture des métadonnées du fichier (attribut) ->
stat
- Fermeture du fichier (libération de l’attribut) ->
close
Les méthodes citées ci-dessus sont à celles appliquées sur les fichiers
ordinaires et peuvent être utilisées de façon identique. Il est cependant à
remarquer que la méthode open
n’autorise pas la création de nouveaux
fichiers.
La taille des données pouvant être échangées ne peut pas dépasser la taille
maximale d’un page mémoire soit PAGE_SIZE
bytes (généralement 4KiB).
Procfs - Interface utilisateur
Procfs est un système de fichiers virtuels créé pour faciliter l’accès aux données et informations du noyau Linux ainsi que sur l’état des processus. La majorité des fichiers se trouvant dans son arborescence sont au format texte et peuvent ainsi être accédés à l’aide d’outils tels que echo et cat.
Pour chaque processus Linux, procfs crée un répertoire avec le numéro du processus correspondant au PID (Process ID). Les différentes informations relatives à l’état du processus sont contenues dans des fichiers séparés, par exemple :
/proc/<PID>/
|-- cwd -> path/symlink to current working directory
|-- exe -> path/symlink to original executable file
|-- root -> path/symlink to the root path as seen by the process
|-- cmdline -> command that launched the process
|-- status -> basic information about the process
|-- task -> directory with all threads in the process
|-- fd -> directory with all open file descriptors
|-- maps -> information about mapped files and blocks (heap, stack...)
|-- limits -> information process' resource limits
|-- ...
/proc/self
permet d’accéder aux informations de son propre processus
Les informations liées au noyau Linux seulement sont fournies par procfs directement à la racine du système de fichiers virtuels, par exemple :
/proc/
|-- cmdline -> command that launched the Linux kernel (boot options)
|-- cpuinfo -> information about CPU and vendor
|-- devices -> list of device drivers (character or block)
|-- modules -> list of loaded modules
|-- meminfo -> information about memory usage
|-- version -> information about Linux kernel version
|-- interrupts -> information about number of interrupts per CPU and I/O
|-- iomem -> information about I/O memory map
|-- net -> directory with information about network
Les méthodes que celles appliquées sur les fichiers ordinaires peuvent être
utilisées sur ces fichiers. Cependant, pour faciliter l’accès à ces informations, il
existe naturellement toute une série d’utilitaires, par exemple : ps
, uname
, dmesg
, …
Plus de détails sous http://man7.org/linux/man-pages/man5/proc.5.html