Was passiert, wenn ich cat /proc/cpuinfo
schreibe . Ist das eine benannte Pipe (oder etwas anderes) zum Betriebssystem, die die CPU-Informationen spontan liest und diesen Text bei jedem Aufruf generiert?
Akzeptierte Antwort:
Immer wenn Sie eine Datei unter /proc
lesen , ruft dies einen Code im Kernel auf, der den zu lesenden Text als Dateiinhalt berechnet. Die Tatsache, dass der Inhalt spontan generiert wird, erklärt, warum für fast alle Dateien die Zeit als jetzt und die Größe als 0 gemeldet wird – hier sollten Sie 0 als „weiß nicht“ lesen. Im Gegensatz zu üblichen Dateisystemen wird das Dateisystem auf /proc
gemountet , das procfs heißt, lädt keine Daten von einer Festplatte oder anderen Speichermedien (wie FAT, ext2, zfs, …) oder über das Netzwerk (wie NFS, Samba, …) und ruft keinen Benutzercode auf (im Gegensatz zu FUSE ).
Procfs ist in den meisten Nicht-BSD-Unices vorhanden. Es begann in den Bell Labs von AT&T in der 8. Ausgabe von UNIX, um Informationen über Prozesse (und ps
ist oft ein hübscher Drucker für Informationen, die durch /proc
gelesen werden ). Die meisten procfs-Implementierungen haben eine Datei oder ein Verzeichnis namens /proc/123
um Informationen über den Prozess mit PID 123 zu melden. Linux erweitert das proc-Dateisystem um viele weitere Einträge, die den Zustand des Systems melden, einschließlich Ihres Beispiels /proc/cpuinfo
.
In der Vergangenheit war /proc
von Linux hat verschiedene Dateien erworben, die Informationen über Treiber bereitstellen, aber diese Verwendung ist jetzt zugunsten von /sys
veraltet , und /proc
entwickelt sich jetzt langsam. Einträge wie /proc/bus
und /proc/fs/ext4
bleiben aus Gründen der Abwärtskompatibilität dort, wo sie sind, aber neuere ähnliche Schnittstellen werden unter /sys
erstellt . In dieser Antwort konzentriere ich mich auf Linux.
Ihr erster und zweiter Einstiegspunkt für die Dokumentation über /proc
unter Linux sind:
- der
proc(5)
Manpage; - Der
/proc
Dateisystem in der Kernel-Dokumentation .
Ihr dritter Einstiegspunkt, wenn die Dokumentation ihn nicht abdeckt, ist das Lesen der Quelle . Sie können den Quellcode auf Ihren Computer herunterladen, aber das ist ein riesiges Programm, und LXR, der Linux-Querverweis, ist eine große Hilfe. (Es gibt viele Varianten von LXR; diejenige, die auf lxr.linux.no
läuft ist bei weitem die schönste, aber leider ist die Seite oft down.) Ein wenig C-Kenntnisse sind erforderlich, aber Sie müssen kein Programmierer sein, um einen mysteriösen Wert aufzuspüren.
Die zentrale Handhabung von /proc
Einträge befinden sich im fs/proc
Verzeichnis. Jeder Treiber kann Einträge in /proc
registrieren (obwohl dies, wie oben angegeben, jetzt zugunsten von /sys
veraltet ist ), wenn Sie also in fs/proc
nicht finden, wonach Sie suchen , schauen Sie überall hin. Treiber rufen Funktionen auf, die in include/linux/proc_fs.h
deklariert sind . Kernelversionen bis 3.9 bieten die Funktionen create_proc_entry
und einige Wrapper (insbesondere create_proc_read_entry
) und die Kernel-Versionen 3.10 und höher bieten stattdessen nur proc_create
und proc_create_data
(und noch ein paar mehr).
Unter /proc/cpuinfo
als Beispiel eine Suche nach "cpuinfo"
führt Sie zum Aufruf von proc_create("cpuinfo, …")
in fs/proc/cpuinfo.c
. Sie können sehen, dass der Code ziemlich viel Boilerplate-Code ist:da die meisten Dateien unter /proc
einfach einige Textdaten ausgeben, dafür gibt es Hilfsfunktionen. Es gibt lediglich eine seq_operations
Struktur, und das eigentliche Fleisch befindet sich in cpuinfo_op
Datenstruktur, die architekturabhängig ist und normalerweise in arch/<architecture>/kernel/setup.c
definiert wird (oder manchmal eine andere Datei). Am Beispiel von x86 werden wir zu arch/x86/kernel/cpu/proc.c
geführt . Dort ist die Hauptfunktion show_cpuinfo
, die den gewünschten Dateiinhalt ausdruckt; der Rest der Infrastruktur ist dazu da, die Daten in der geforderten Geschwindigkeit dem Leseprozess zuzuführen. Sie können sehen, wie die Daten im laufenden Betrieb aus Daten in verschiedenen Variablen im Kernel zusammengesetzt werden, einschließlich einiger Zahlen, die im laufenden Betrieb berechnet werden, wie z. B. die CPU-Frequenz.
Ein großer Teil von /proc
sind die Informationen pro Prozess in /proc/<PID>
. Diese Einträge werden in fs/proc/base.c
registriert , im tgid_base_stuff
Array; Einige hier registrierte Funktionen sind in anderen Dateien definiert. Sehen wir uns einige Beispiele an, wie diese Einträge generiert werden:
cmdline
wird vonproc_pid_cmdline
generiert in derselben Datei. Es findet die Daten im Prozess und druckt sie aus.clear_refs
ist im Gegensatz zu den bisher gesehenen Einträgen beschreibbar, aber nicht lesbar. Daher dieproc_clear_refs_operations
Strukturen definiert einclear_refs_write
Funktion, aber keine Lesefunktion.cwd
ist ein symbolischer Link (ein leicht magischer), deklariert durchproc_cwd_link
, das nach dem aktuellen Verzeichnis des Prozesses sucht und es als Linkinhalt zurückgibt.fd
ist ein Unterverzeichnis. Die Operationen auf dem Verzeichnis selbst werden inproc_fd_operations
definiert Datenstruktur (sie sind Boilerplate mit Ausnahme der Funktion, die die Einträge aufzählt,proc_readfd
, das die geöffneten Dateien des Prozesses auflistet), während Operationen an den Einträgen in `proc_fd_inode_operations.
sind
Ein weiterer wichtiger Bereich von /proc
ist /proc/sys
, das eine direkte Schnittstelle zu sysctl
ist . Das Lesen aus einem Eintrag in dieser Hierarchie gibt den Wert des entsprechenden sysctl-Werts zurück, und das Schreiben setzt den sysctl-Wert. Die Einstiegspunkte für sysctl befinden sich in fs/proc/proc_sysctl.c
. Sysctls haben ihr eigenes Registrierungssystem mit register_sysctl
und Freunde.