$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty 136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim 64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
- Ich habe mich gefragt, ob alle Dateien
/dev
und deren Unterverzeichnisse Dateideskriptoren von Geräten sind.
- Warum gibt es so viele Links voneinander? Zum Beispiel
/dev/fd/0
,
/dev/stdin
, /proc/self/fd/0
sind alle Links zu /dev/pts/2
.
- Wenn
l
in lrwx------
Mean Link, was bedeutet c
in crw--w----
?
Antworten:
Fast alle Dateien unter
/dev
sind Gerätedateien . Während das Lesen und Schreiben in einer regulären 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 einer Hardware (einem Hardwaregerät, daher der Name) kommuniziert.Es gibt zwei Arten von Gerätedateien: Blockgeräte (angezeigt
b
als erstes Zeichen in der Ausgabe vonls -l
) und Zeichengeräte (angezeigt durchc
). 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 mit einem bestimmten Versatz schreiben und später mit diesem Versatz vom Gerät lesen, erhalten Sie dieses Byte zurück. Zeichengeräte sind fast alles andere, bei denen das Schreiben eines Bytes eine unmittelbare Auswirkung hat (z. B. wenn es auf einer seriellen Leitung ausgegeben wird) und das Lesen eines Bytes eine unmittelbare Auswirkung hat (z. B. wenn es von der seriellen Schnittstelle gelesen wird).Die Bedeutung einer Gerätedatei wird durch ihre Nummer bestimmt, nicht durch ihren Namen (der Name ist für Anwendungen wichtig, nicht aber für den Kernel). Die Nummer besteht eigentlich aus zwei Nummern: Die Hauptnummer gibt an, welcher Treiber für dieses Gerät verantwortlich ist, und die untergeordnete Nummer ermöglicht es einem Fahrer, mehrere Geräte zu steuern¹. Diese Zahlen erscheinen in der
ls -l
Liste, wo Sie normalerweise die Dateigröße finden würden. ZBbrw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ dieses Gerät ist Dur 8, Moll 0.Einige Gerätedateien unter
/dev
entsprechen nicht den Hardwaregeräten. Eines, das auf jedem Unix-System existiert, ist/dev/null
: Das Schreiben darauf hat keine Auswirkung, und das Lesen darauf gibt keine Daten zurück. In Shell-Skripten ist es oft praktisch, wenn Sie die Ausgabe eines Befehls (>/dev/null
) ignorieren oder einen Befehl ohne Eingabe (</dev/null
) ausführen möchten . Andere gebräuchliche Beispiele sind/dev/zero
(die null Bytes und unendlich zurückgeben )/dev/urandom
(die zufällige Bytes und unendlich zurückgeben ).Einige Gerätedateien haben eine Bedeutung, die vom Prozess abhängt, der darauf zugreift. Zum Beispiel
/dev/stdin
bezeichnet die Standardeingabe des aktuellen Prozesses; Das Öffnen von hat ungefähr die gleiche Wirkung wie das Öffnen der Originaldatei, die als Standardeingabe für den Prozess geöffnet wurde./dev/tty
Bezeichnet in ähnlicher Weise das Terminal, an das der Prozess angeschlossen ist. Unter Linux werden heutzutage/dev/stdin
und Freunde nicht als Zeichengeräte implementiert, sondern als symbolische Links zu einem allgemeineren Mechanismus, mit dem auf jeden Dateideskriptor verwiesen werden kann (im Gegensatz zu nur 0, 1 und 2 bei der herkömmlichen Methode). Zum Beispiel/dev/stdin
ist ein symbolischer Link zu/proc/self/fd/0
. Siehe In welcher Beziehung steht / dev / fd zu / proc / self / fd /? .Unter finden Sie eine Reihe symbolischer Links
/dev
. Dies kann aus historischen Gründen auftreten: Eine Gerätedatei wurde von einem Namen in einen anderen verschoben, einige Anwendungen verwenden jedoch weiterhin den alten Namen. Zum Beispiel/dev/scd0
ist eine symbolische Verknüpfung zu/dev/sr0
unter Linux; beide bezeichnen das erste CD-Gerät. Ein weiterer Grund für symbolische Verknüpfungen 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 und Partitionen entsprechend dem Partitionslayout),/dev/disk/by-id/*
(Festplatten mit einem eindeutige Seriennummer)/dev/disk/by-label/*
(Partitionen mit einem Dateisystem, gekennzeichnet durch ein vom Menschen gewähltes Etikett); und mehr. Symbolische Links werden auch verwendet, wenn ein generischer Gerätename einer von mehreren sein kann. zum Beispiel/dev/dvd
Dies kann eine symbolische Verknüpfung zu/dev/sr0
oder eine Verknüpfung zu sein,/dev/sr1
wenn Sie zwei CD-Leser haben und der zweite der Standard-DVD-Leser sein soll.Schließlich gibt es noch ein paar andere Dateien, die Sie
/dev
aus traditionellen Gründen möglicherweise unter finden . Sie werden nicht auf jedem System dasselbe finden. Bei den meisten Unices/dev/log
ist dies ein Socket , über den Programme Protokollnachrichten ausgeben./dev/MAKEDEV
ist ein Skript, das Einträge in erstellt/dev
. Auf modernen Linux-Systemen werden Einträge in/dev/
automatisch durch udev erstellt und sind obsoletMAKEDEV
.¹ Unter Linux ist dies nicht mehr der Fall, aber dieses Detail ist nur für Gerätetreiber relevant.
quelle
ls -l
Liste, in der Sie normalerweise die Dateigröße vor dem Datum finden, z. B.brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ dieses Gerät ist Major 8, Minor 0. In der Praxis kommen Gerätenummern nicht oft vor, ich habe sie nur erwähnt, um es zu sagen Was macht ein Gerät zu einem Gerät (am wichtigsten ist es nicht der Dateiname). Eine Dateideskriptornummer hat nur in einem bestimmten Prozess eine Bedeutung./dev/stdin
(=>/proc/self/fd/0
) unter Linux hat nicht den gleichen Effekt wie das Duplizieren von Standardeingaben. Um den Unterschied zu sehen,su - non_root_user
dannexec 5</dev/stdin
wird scheitern mit „Zugriff verweigert“, aberexec 5<&0
erfolgreich sein wird. Und es ist nicht nur , dass die neue fd mit verschiedenen Flaggen geöffnet werden, alles über das Dateiobjekt ( „Datei öffnet descrip tion “ in POSIX - Jargon) wird anders sein (Dateizeiger - Offset, non / Blockiermodus, usw.)./dev/
./dev/stdin
. Dies gilt nicht darauf statisch auf ,/dev/pts/2
oder jede andere - wechseln Sie einfach zu einem anderen Endgerät und Sie werden sehen./dev/stdin
ist die Standardeingabe Ihrer aktuellen Terminalsitzung. Das ist auch ein Beispiel, warum es ein Symlink sein muss.man mknod
undinfo coreutils 'mknod invocation'
. Im Allgemeinenc
steht für ein Zeichen Gerätetyp.quelle
/dev/stdin
bezieht sich auf die Standardeingabe des Prozesses, der ihn öffnet. Alles in/proc/$pid
ist prozessabhängig und/proc/self
eine Art magischer Link, der auf die eigenen Daten des Prozesses verweist.Bei Ihrer ersten Frage handelt es sich nicht um Dateideskriptoren, sondern um Gerätedateien. (auch bekannt als "Dev Nodes")
Diese Dateien sind an den Treiber gebunden, der das Gerät unter Verwendung von Haupt- und Nebennummern verarbeitet. (Beispielsweise
ls
bezieht sich "136, 2" in Ihrer Ausgabe auf den Gerätetreiber, der an die Hauptnummer 136 gebunden ist, und gibt Gerät 2 an, das von diesem Treiber verarbeitet wird.)Der erste Ausgabebuchstabe von
ls -l
ist der Gerätetyp bei Gerätedateien. Wenn es 'c' ist, ist es ein Zeichengerät, oder wenn es 'b' ist, ist es ein Blockgerät.Für Ihre zweite Frage beziehen Sie sich auf die obige Antwort von rozcietrzewiacz.
quelle