Andere Antworten fügten großartige Dinge hinzu. Ich werde nur meine 2 Cents hinzufügen.
Laut Wikipedia wissen wir sicher: ein Dateideskriptor ist eine nicht-negative ganze Zahl. Das Wichtigste, was meiner Meinung nach fehlt, wäre zu sagen:
Dateideskriptoren sind an eine Prozess-ID gebunden.
Wir wissen, dass die bekanntesten Dateideskriptoren 0, 1 und 2 sind. 0 entspricht STDIN
, 1 bis STDOUT
und 2 bis STDERR
.
Nehmen wir als Beispiel die Shell-Prozesse und was bedeutet das für sie?
Prüfen Sie diesen Code
#>sleep 1000 &
[12] 14726
Wir haben einen Prozess mit der ID 14726 (PID) erstellt. Unter Verwendung der lsof -p 14726
können wir die Dinge so bekommen:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sleep 14726 root cwd DIR 8,1 4096 1201140 /home/x
sleep 14726 root rtd DIR 8,1 4096 2 /
sleep 14726 root txt REG 8,1 35000 786587 /bin/sleep
sleep 14726 root mem REG 8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep 14726 root mem REG 8,1 2030544 137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep 14726 root mem REG 8,1 170960 137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
Die 4. Spalte FD und die nächste Spalte TYPE entsprechen dem Dateideskriptor und dem Dateideskriptortyp.
Einige der Werte für den FD können sein:
cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
Aber der eigentliche Dateideskriptor ist unter:
NUMBER – Represent the actual file descriptor.
Das Zeichen nach der Zahl, z. B. "1u", steht für den Modus, in dem die Datei geöffnet wird. r für Lesen, w für Schreiben, u für Lesen und Schreiben.
TYPE gibt den Typ der Datei an. Einige der Werte von TYPEs sind:
REG – Regular File
DIR – Directory
FIFO – First In First Out
Aber alle Dateideskriptoren sind CHR - Zeichenspezialdatei (oder Zeichengerätedatei)
Jetzt können wir die Dateideskriptoren für STDIN
, STDOUT
y STDERR
einfach mit lsof -p PID
oder wir können dasselbe sehen, wenn wir ls /proc/PID/fd
.
Beachten Sie auch, dass die Dateideskriptor-Tabelle, die der Kernel verwaltet, nicht mit der Datei- oder Inodes-Tabelle identisch ist. Diese sind getrennt, wie einige andere Antworten erklärt haben.
![fd table]()
Sie fragen sich vielleicht, wo diese Dateideskriptoren physikalisch sind und was in /dev/pts/6
zum Beispiel
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
Nun, /dev/pts/6
lebt nur in der Erinnerung. Es handelt sich nicht um normale Dateien, sondern um so genannte Zeichengerätedateien . Sie können dies mit überprüfen: ls -l /dev/pts/6
und sie werden beginnen mit c
in meinem Fall crw--w----
.
Nur zur Erinnerung: Die meisten Linux-ähnlichen Betriebssysteme definieren sieben Dateitypen:
- Reguläre Dateien
- Verzeichnisse
- Zeichengerätedateien
- Gerätedateien sperren
- Lokale Domain-Sockets
- Benannte Leitungen (FIFOs) und
- Symbolische Verbindungen
4 Stimmen
Was ist mit den Konzepten von stdin, stdout, stderr usw.? Ich habe eine Instanz wie z.B. einen Browser-Prozess geöffnet und dieser hat einige temporäre Dateien für die Anzeige meiner HTML-Dateien geöffnet. Der Prozess verwendet die gleiche fd zum Lesen / Schreiben? Auch die Prozesstabelle ....... hat Einträge wie fd0 Zeiger fd1 Zeiger fd2 Zeiger ..... bedeutet das, dass alle diese Dateien im RAM sind? Warum sonst Zeiger ?
87 Stimmen
Wenn Sie eine Datei öffnen, erstellt das Betriebssystem einen Stream zu dieser Datei und verbindet diesen Stream mit der geöffneten Datei, wobei der Deskriptor diesen Stream darstellt. In ähnlicher Weise gibt es einige Standard-Streams, die vom Betriebssystem erstellt werden. Diese Streams sind mit Ihrem Terminal anstelle von Dateien verbunden. Wenn Sie also etwas im Terminal schreiben, geht es in den stdin-Stream und das Betriebssystem. Und wenn Sie im Terminal den Befehl "ls" eingeben, schreibt das Betriebssystem die Ausgabe in den stdout-Stream. stdout ist mit Ihrem Bildschirm verbunden, so dass Sie die Ausgabe dort sehen können.
2 Stimmen
Was das Beispiel des Browsers betrifft, so ist es nicht notwendig, dass der Browser die geöffneten Dateien speichert. Es hängt von der Implementierung des Browsers ab, aber in den meisten Fällen öffnet der Browser eine temporäre Datei, schreibt die Datei und schließt die Datei, so dass es nicht notwendig ist, dass die Datei geöffnet ist, auch wenn die Webseite geöffnet ist. Und der Deskriptor enthält nur die Informationen der Datei und hält die Datei nicht unbedingt im RAM. Wenn Sie die Daten aus einem Deskriptor lesen, liest das Betriebssystem die Daten von der Festplatte. Die Informationen im Dateideskriptor stellen nur den Speicherort der Datei auf der Festplatte usw. dar.
7 Stimmen
Die Zuordnung von Dateideskriptor zu Datei ist keine Eins-zu-eins-Zuordnung. Ich könnte dieselbe Datei 4 Mal öffnen() und 4 verschiedene Dateideskriptoren erhalten. Jeder davon könnte (je nach den an open() übergebenen Flags) zum Lesen, Schreiben oder für beides verwendet werden. Ob die Datei im RAM oder auf der Festplatte liegt, wird vom Kernel und seinen verschiedenen Caches verborgen. Letztendlich wird das, was sich im Cache befindet, mit dem übereinstimmen, was sich auf der Festplatte befindet (zum Schreiben), und der Kernel wird zum Lesen nicht auf die Festplatte zurückgreifen, wenn sich die Daten bereits im Cache befinden.
0 Stimmen
Meine Frage geht vielleicht zu weit, aber wie bestimmt das Betriebssystem, auf welchem tty die Ausgaben angezeigt werden, wenn die Indizes von fd1 und fd2 festgelegt sind?
10 Stimmen
Dies ist ein guter Artikel, um es leicht zu verstehen bottomupcs.com/file_descriptors.xhtml
1 Stimmen
@suzukimilanpaak Sie gehen zu der Stelle, zu der sie im übergeordneten Prozess gegangen sind, es sei denn, etwas setzt das außer Kraft.
1 Stimmen
@KrishanGopal: Vielen Dank für diesen Artikel. Er war wirklich gut geschrieben.
1 Stimmen
Hier finden Sie einen guten Überblick über die Geschichte: Standard-Streams aus wikipedia. Der Artikel geht zurück bis in die 1950er Jahre und diskutiert das Unix-Design und erklärt, warum sie standardisiert wurden und die Werte.
0 Stimmen
@KrishanGopal danke für den Artikel. Dies ist eine großartige Frage, aber keine der Antworten gab ein konkretes Beispiel wie dieser Artikel.
0 Stimmen
Auch dies pregunta könnte nützlich sein