Zusätzlich zu den Antworten von @ RuiFRibeiro und @ BruceEdiger unterscheidet sich der Kernel nicht genau. Tatsächlich gibt es verschiedene Arten von Dateien: normale Dateien, Verzeichnisse, symbolische Links, Geräte, Sockets (und ich vergesse immer einige, damit ich nicht versuche, eine vollständige Liste zu erstellen). Sie können die Informationen über den Typ einer Datei erhalten, ls
indem Sie Folgendes eingeben : Es ist das erste Zeichen in der Zeile. Beispielsweise:
$ls -la /dev/sda
brw-rw---- 1 root disk 8, 0 17 nov. 08:29 /dev/sda
Das 'b' ganz am Anfang signalisiert, dass diese Datei ein Blockgerät ist. Ein Bindestrich bedeutet eine reguläre Datei, eine symbolische Verknüpfung und so weiter. Diese Informationen werden in den Metadaten der Datei gespeichert und sind beispielsweise über den Systemaufruf zugänglich stat
, sodass der Kernel beispielsweise eine Datei und einen symbolischen Link unterschiedlich lesen kann.
Dann machen Sie eine weitere Unterscheidung zwischen "echten" /bin/bash
und "virtuellen" Dateien, /proc/cpuinfo
aber geben ls
beide als reguläre Dateien an, sodass der Unterschied anders ist:
ls -la /proc/cpuinfo /bin/bash
-rwxr-xr-x 1 root root 829792 24 août 10:58 /bin/bash
-r--r--r-- 1 root wheel 0 20 nov. 16:50 /proc/cpuinfo
Was passiert ist, dass sie zu verschiedenen Dateisystemen gehören. /proc
ist der Einhängepunkt eines Pseudo-Dateisystems, procfs
wohingegen er /bin/bash
sich auf einem regulären Festplatten-Dateisystem befindet. Wenn Linux eine Datei öffnet (dies ist je nach Dateisystem unterschiedlich), wird eine Datenstruktur aufgefüllt, file
die unter anderem eine Struktur aus mehreren Funktionszeigern enthält, die die Verwendung dieser Datei beschreiben. Daher können unterschiedliche Verhaltensweisen für verschiedene Dateitypen implementiert werden.
Dies sind beispielsweise die Vorgänge, die angekündigt werden von /proc/meminfo
:
static int meminfo_proc_open(struct inode *inode, struct file *file)
{
return single_open(file, meminfo_proc_show, NULL);
}
static const struct file_operations meminfo_proc_fops = {
.open = meminfo_proc_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
Wenn Sie sich die Definition von ansehen meminfo_proc_open
, können Sie sehen, dass diese Funktion einen Puffer im Speicher mit den von der Funktion zurückgegebenen Informationen füllt meminfo_proc_show
, deren Aufgabe es ist, Daten über die Speichernutzung zu sammeln. Diese Informationen können dann normal gelesen werden. Bei jedem Öffnen der Datei wird die Funktion meminfo_proc_open
aufgerufen und die Informationen zum Speicher werden aktualisiert.