C'est en fait assez simple, du moins si vous n'avez pas besoin des détails de la mise en œuvre.
Tout d’abord, sous Linux, tous les systèmes de fichiers (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) sont implémentés dans le noyau. Certains peuvent décharger du travail sur le code utilisateur via FUSE, et d’autres ne se présentent que sous la forme d’un module de noyau ( ZFS natif est un exemple notable de ce dernier en raison de restrictions de licence), mais dans tous les cas, il reste un composant du noyau. Ceci est une base importante.
Lorsqu'un programme veut lire à partir d' un fichier, il publiera plusieurs appels à la bibliothèque du système qui finissent en fin de compte dans le noyau sous la forme d'un open()
, read()
, close()
séquence (éventuellement avec seek()
pour faire bonne mesure). Le noyau prend le chemin et le nom de fichier fournis et, au travers du système de fichiers et de la couche d'E / S du périphérique, les traduit en demandes de lecture physiques (et, dans de nombreux cas, également en demandes d'écriture - pensez par exemple à des mises à jour) sur un stockage sous-jacent.
Cependant, il n'est pas nécessaire de traduire ces demandes spécifiquement en stockage physique persistant . Le contrat du noyau stipule que l'émission de cet ensemble particulier d'appels système fournira le contenu du fichier en question . Où exactement dans notre royaume physique le "fichier" existe est secondaire à ceci.
On /proc
est généralement monté ce qu'on appelle procfs
. Il s’agit d’un type de système de fichiers spécial, mais comme il s’agit d’un système de fichiers, il n’est en réalité pas différent d’un ext3
système de fichiers monté quelque part. Ainsi, la demande est transmise au code du pilote de système de fichiers procfs, qui connaît tous ces fichiers et répertoires et renvoie des informations particulières à partir des structures de données du noyau .
Dans ce cas, la "couche de stockage" correspond aux structures de données du noyau et procfs
fournit une interface propre et pratique pour y accéder. Gardez à l'esprit que le montage de procfs à /proc
est simplement une convention; vous pourriez tout aussi facilement le monter ailleurs. En fait, cela est parfois fait, par exemple dans les jails chroot lorsque le processus qui y est exécuté doit avoir accès à / proc pour une raison quelconque.
Cela fonctionne de la même manière si vous écrivez une valeur dans un fichier. au niveau du noyau, qui se traduit par une série de open()
, seek()
, write()
, close()
appels qui se nouveau transmis au pilote de système de fichiers; encore une fois, dans ce cas particulier, le code procfs.
La raison particulière pour laquelle vous voyez file
revenir empty
est que beaucoup de fichiers exposés par procfs sont exposés avec une taille de 0 octet. La taille de 0 octet est probablement une optimisation côté noyau (la plupart des fichiers de / proc sont dynamiques et peuvent facilement varier en longueur, éventuellement même d’une lecture à l’autre, et calculer la longueur de chaque fichier à chaque lecture du répertoire potentiellement très cher). En passant par les commentaires de cette réponse, que vous pouvez vérifier sur votre propre système en exécutant strace ou un outil similaire, file
lance d'abord un stat()
appel pour détecter tout fichier spécial, puis en profite, si la taille du fichier est 0. , abandonnez et signalez que le fichier est vide.
Ce comportement est en fait documenté et peut être remplacé en spécifiant -s
ou --special-files
sur l' file
invocation, bien que , comme indiqué dans la page de manuel, cela puisse avoir des effets secondaires. La citation ci-dessous provient de la page de manuel relative au fichier BSD 5.11, datée du 17 octobre 2011.
Normalement, seul le fichier tente de lire et de déterminer le type de fichiers d'arguments pour lesquels les rapports stat (2) sont des fichiers ordinaires. Cela évite les problèmes, car la lecture de fichiers spéciaux peut avoir des conséquences particulières. En spécifiant l' -s
option, le fichier lira également les fichiers d'arguments qui sont des fichiers spéciaux de bloc ou de caractère. Ceci est utile pour déterminer les types de système de fichiers des données dans les partitions de disque brutes, qui sont des fichiers spéciaux bloqués. Cette option permet également à file de ne pas tenir compte de la taille de fichier indiquée par stat (2) car, sur certains systèmes, elle indique une taille nulle pour les partitions de disque brutes.
strace file /proc/version
oultrace -S /proc/version
, l'optimisation est plutôt petite. Il passestat()
d'abord un appel et constate que la taille est 0, sautant ainsi leopen()
- mais auparavant, il charge plusieurs fichiers magiques.