Fast alle Dateien unter /dev
sind Gerätedateien. Während das Lesen und Schreiben in eine normale Datei Daten auf einer Festplatte oder einem anderen Dateisystem speichert, kommuniziert der Zugriff auf eine Gerätedatei mit einem Treiber im Kernel, der im Allgemeinen wiederum mit einem Stück Hardware (einem Hardwaregerät, daher der Name) kommuniziert /P>
Es gibt zwei Arten von Gerätedateien:Blockgeräte (gekennzeichnet durch b
als erstes Zeichen in der Ausgabe von ls -l
) und Zeichengeräte (angezeigt durch c
). Die Unterscheidung zwischen Block- und Zeichengeräten ist nicht ganz universell. Blockgeräte sind Dinge wie Festplatten, die sich wie große Dateien mit fester Größe verhalten:Wenn Sie ein Byte an einem bestimmten Offset schreiben und später an diesem Offset vom Gerät lesen, erhalten Sie dieses Byte zurück. Zeichengeräte sind so ziemlich alles andere, wo das Schreiben eines Bytes eine unmittelbare Auswirkung hat (z. B. wird es auf einer seriellen Leitung ausgegeben) und das Lesen eines Bytes ebenfalls eine unmittelbare Auswirkung hat (z. B. wird es von der seriellen Schnittstelle gelesen).
Die Bedeutung einer Gerätedatei wird durch ihre Nummer bestimmt, nicht durch ihren Namen (der Name spielt für Anwendungen eine Rolle, aber nicht für den Kernel). Die Nummer besteht eigentlich aus zwei Nummern:Die Major-Nummer gibt an, welcher Treiber für dieses Gerät zuständig ist, und die Minor-Nummer ermöglicht es einem Treiber, mehrere Geräte zu steuern¹. Diese Nummern erscheinen in ls -l
Auflistung, wo Sie normalerweise die Dateigröße finden würden. Z.B. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ Dieses Gerät ist Major 8, Minor 0.
Einige Gerätedateien unter /dev
entsprechen nicht Hardwaregeräten. Eines, das auf jedem Unix-System existiert, ist /dev/null
; das Schreiben darauf hat keine Wirkung, und das Lesen von ihm gibt niemals Daten zurück. In Shell-Skripten ist es oft praktisch, wenn Sie die Ausgabe eines Befehls ignorieren möchten (>/dev/null
) oder einen Befehl ohne Eingabe ausführen (</dev/null
). Andere gängige Beispiele sind /dev/zero
(was Null-Bytes ad infinitum zurückgibt ) /dev/urandom
(was zufällige Bytes ad infinitum zurückgibt ).
Einige Gerätedateien haben eine Bedeutung, die von dem Prozess abhängt, der darauf zugreift. Beispiel:/dev/stdin
bezeichnet die Standardeingabe des aktuellen Prozesses; Das Öffnen von hat ungefähr den gleichen Effekt wie das Öffnen der Originaldatei, die als Standardeingabe des Prozesses geöffnet wurde. Etwas ähnlich, /dev/tty
bezeichnet das Terminal, an dem der Prozess angeschlossen ist. Unter Linux heutzutage /dev/stdin
und Freunde werden nicht als Zeichengeräte implementiert, sondern als symbolische Links zu einem allgemeineren Mechanismus, der es ermöglicht, auf jeden Dateideskriptor zu verweisen (im Gegensatz zu nur 0, 1 und 2 bei der traditionellen Methode); zum Beispiel /dev/stdin
ist ein symbolischer Link zu /proc/self/fd/0
. Siehe Wie verhält sich /dev/fd zu /proc/self/fd/?.
Unter /dev
finden Sie einige symbolische Links . Dies kann aus historischen Gründen auftreten:Eine Gerätedatei wurde von einem Namen auf einen anderen verschoben, aber einige Anwendungen verwenden immer noch den alten Namen. Beispiel:/dev/scd0
ist ein symbolischer Link zu /dev/sr0
unter Linux; beide bezeichnen das erste CD-Gerät. Ein weiterer Grund für symbolische Links ist die Organisation:Unter Linux finden Sie Ihre Festplatten und Partitionen an mehreren Stellen:/dev/sda
und /dev/sda1
und Freunde (jede Festplatte mit einem beliebigen Buchstaben bezeichnet und Partitionen entsprechend dem Partitionslayout), /dev/disk/by-id/*
(Festplatten mit eindeutiger Seriennummer), /dev/disk/by-label/*
(Partitionen mit einem Dateisystem, gekennzeichnet durch ein vom Menschen gewähltes Label); und mehr. Symbolische Links werden auch verwendet, wenn ein generischer Gerätename einer von mehreren sein könnte; zum Beispiel /dev/dvd
könnte ein symbolischer Link zu /dev/sr0
sein , oder es könnte ein Link zu /dev/sr1
sein wenn Sie zwei CD-Lesegeräte haben und das zweite das Standard-DVD-Lesegerät sein soll.
Schließlich gibt es noch ein paar andere Dateien, die Sie unter /dev
finden könnten , aus traditionellen Gründen. Sie werden nicht auf jedem System dasselbe finden. Auf den meisten Unices /dev/log
ist ein Socket, den Programme verwenden, um Protokollmeldungen auszugeben. /dev/MAKEDEV
ist ein Skript, das Einträge in /dev
erstellt . Auf modernen Linux-Systemen Einträge in /dev/
werden automatisch von udev erstellt und machen MAKEDEV
überflüssig .
¹ Dies trifft unter Linux eigentlich nicht mehr zu, aber dieses Detail ist nur für Gerätetreiber-Autoren von Bedeutung.
- Ja - entweder direkt oder als Symlinks - das ist
/dev/
ist für. - Für verschiedene Zwecke:manchmal für die Kompatibilität zwischen Namensschemata, manchmal ist es für die Arbeitsumgebung notwendig - wie im Beispiel von
/dev/stdin
. Dies nicht Punkt statisch bis/dev/pts/2
oder ein anderes - wechseln Sie einfach zu einem anderen Terminal und Sie werden sehen./dev/stdin
ist die Standardeingabe Ihres aktuellen Terminalsitzung. Das ist auch ein Beispiel dafür, warum es ein Symlink sein muss. - Siehe
man mknod
undinfo coreutils 'mknod invocation'
. Im Allgemeinenc
steht für einen Zeichengerätetyp.
Für Ihre erste Frage, es handelt sich nicht um Dateideskriptoren, sondern um Gerätedateien. (auch bekannt als "Entwicklungsknoten")
Diese Dateien sind mit dem Treiber verbunden, der das Gerät mit Major- und Minor-Nummern verwaltet. (Zum Beispiel "136, 2" in Ihrem ls
Ausgabe bezieht sich auf den Gerätetreiber, der an die Major-Nummer 136 gebunden ist, und gibt Gerät Nr. 2 an, das von diesem Treiber verwaltet wird.)
Der erste Buchstabe der Ausgabe von ls -l
ist bei Gerätedateien der Gerätetyp. Wenn es 'c' ist, ist es ein Zeichengerät, oder wenn es 'b' ist, ist es ein Blockgerät.
Beziehen Sie sich für Ihre zweite Frage auf die obige Antwort von rozcietrzewiacz.