Es ist eigentlich ziemlich einfach, zumindest wenn Sie die Implementierungsdetails nicht benötigen.
Zunächst werden unter Linux alle Dateisysteme (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) im Kernel implementiert. Einige können über FUSE Arbeit an Userland-Code verlagern, andere nur in Form eines Kernel-Moduls ( natives ZFS) ist aufgrund von Lizenzbeschränkungen ein bemerkenswertes Beispiel für Letzteres), aber in beiden Fällen bleibt eine Kernelkomponente erhalten. Dies ist eine wichtige Grundlage.
Wenn ein Programm aus einer Datei lesen möchte, gibt es verschiedene Systembibliothekaufrufe aus, die schließlich in Form einer open()
,, read()
- close()
Sequenz (eventuell mit einem seek()
guten Einwurf) im Kernel enden . Der Kernel nimmt den angegebenen Pfad und Dateinamen an und übersetzt diese über das Dateisystem und die E / A-Ebene der Geräte in physische Leseanforderungen (und in vielen Fällen auch Schreibanforderungen - etwa Aktualisierungen) - in einen zugrunde liegenden Speicher.
Diese Anforderungen müssen jedoch nicht speziell in physischen, dauerhaften Speicher übersetzt werden . Der Vertrag des Kernels besagt, dass die Ausgabe der betreffenden Systemaufrufe den Inhalt der betreffenden Datei bereitstellt . Wo genau in unserem physischen Bereich die "Datei" existiert, ist zweitrangig.
Ein /proc
ist in der Regel montiert, was bekannt ist procfs
. Dies ist ein spezieller Dateisystemtyp, aber da es sich um ein Dateisystem handelt, unterscheidet es sich nicht wirklich von einem ext3
Dateisystem, das irgendwo angehängt ist. Die Anforderung wird also an den procfs-Dateisystemtreibercode übergeben, der alle diese Dateien und Verzeichnisse kennt und bestimmte Informationen aus den Kernel-Datenstrukturen zurückgibt .
Die "Speicherebene" ist in diesem Fall die Kernel-Datenstruktur und procfs
bietet eine saubere, bequeme Schnittstelle für den Zugriff auf diese. Denken Sie daran, dass das Einhängen von procfs /proc
einfach eine Konvention ist. Sie könnten es genauso einfach anderswo montieren. In der Tat geschieht dies manchmal, beispielsweise in Chroot-Gefängnissen, wenn der Prozess, der dort ausgeführt wird, aus irgendeinem Grund Zugriff auf / proc benötigt.
Dies funktioniert genauso, wenn Sie einen Wert in eine Datei schreiben. auf Kernel - Ebene, übersetzt, die zu einer Reihe von open()
, seek()
, write()
, close()
Anrufen, die wieder in den Dateisystem - Treiber übergeben bekommen; in diesem speziellen Fall wiederum der procfs-Code.
Der besondere Grund für die file
Rückkehr empty
ist, dass viele der von procfs bereitgestellten Dateien mit einer Größe von 0 Byte verfügbar gemacht werden . Die 0-Byte-Größe ist wahrscheinlich eine Optimierung auf der Kernel-Seite (viele der Dateien in / proc sind dynamisch und können leicht in der Länge variieren, möglicherweise sogar von einem Lesevorgang zum nächsten), und die Länge jeder Datei wird für jedes gelesene Verzeichnis berechnet möglicherweise sehr teuer sein). Durch die Kommentare zu dieser Antwort, die Sie auf Ihrem eigenen System durch Ausführen von strace oder einem ähnlichen Tool überprüfen können, wird file
zunächst ein stat()
Aufruf zur Erkennung bestimmter Dateien ausgegeben. Anschließend wird die Gelegenheit genutzt, wenn die Dateigröße mit 0 angegeben wird, abbrechen und melden Sie die Datei als leer.
Dieses Verhalten ist tatsächlich dokumentiert und kann durch Angabe -s
oder --special-files
beim file
Aufruf außer Kraft gesetzt werden , obwohl dies auf der Manpage angegeben ist, die Nebenwirkungen haben kann. Das folgende Zitat stammt aus der Manpage BSD file 5.11 vom 17. Oktober 2011.
Normalerweise versucht file nur, den Typ der Argumentdateien zu lesen und zu bestimmen, bei denen stat (2) Berichte gewöhnliche Dateien sind. Dadurch werden Probleme vermieden, da das Lesen spezieller Dateien besondere Konsequenzen haben kann. Durch die Angabe der
-s
Option werden in der Datei auch Argumentdateien gelesen, bei denen es sich um Block- oder Zeichendateien handelt. Dies ist nützlich, um die Dateisystemtypen der Daten in RAW-Partitionen zu ermitteln, bei denen es sich um spezielle Blockdateien handelt. Diese Option bewirkt auch, dass die Datei die von stat (2) gemeldete Dateigröße ignoriert, da sie auf einigen Systemen eine Nullgröße für unformatierte Festplattenpartitionen meldet.