Andere Antworten fügten großartige Dinge hinzu. Ich werde nur meine 2 Cent hinzufügen.
Laut Wikipedia wissen wir sicher: Ein Dateideskriptor ist eine nicht negative Ganzzahl. Das Wichtigste, was mir 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 Shell-Prozesse und wie trifft dies zu?
Überprüfen Sie diesen Code
#>sleep 1000 &
[12] 14726
Wir haben einen Prozess mit der ID 14726 (PID) erstellt. Mit dem können lsof -p 14726
wir die Dinge wie folgt 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 die FD können sein:
cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
Der eigentliche Dateideskriptor befindet sich jedoch unter:
NUMBER – Represent the actual file descriptor.
Das Zeichen nach der Zahl, dh "1u", repräsentiert den Modus, in dem die Datei geöffnet wird. r zum Lesen, w zum Schreiben, u zum Lesen und Schreiben.
TYPE gibt den Dateityp an. Einige der Werte von TYPEs sind:
REG – Regular File
DIR – Directory
FIFO – First In First Out
Alle Dateideskriptoren sind jedoch CHR - Character Special File (oder Character Device File).
Jetzt können wir die Dateideskriptoren für identifizieren STDIN
, STDOUT
und STDERR
einfach mit lsof -p PID
, oder wir können das gleiche , wenn wir sehen ls /proc/PID/fd
.
Beachten Sie auch, dass die Dateideskriptortabelle, die der Kernel verfolgt, nicht mit der Dateitabelle oder der Inodes-Tabelle identisch ist. Diese sind getrennt, wie einige andere Antworten erklärt haben.
![fd Tabelle](https://i.stack.imgur.com/mwAJm.png)
Sie fragen sich, wo diese Filedeskriptoren physisch sind und was gespeichert ist /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 Erinnerung. Dies sind keine regulären Dateien, sondern sogenannte Zeichengerätedateien . Sie können dies überprüfen mit: ls -l /dev/pts/6
und sie beginnen c
in meinem Fall mit crw--w----
.
Um sich an die meisten Linux-ähnlichen Betriebssysteme zu erinnern, definieren Sie sieben Dateitypen:
- Normale Dateien
- Verzeichnisse
- Zeichengerätedateien
- Gerätedateien blockieren
- Lokale Domain-Sockets
- Named Pipes (FIFOs) und
- Symbolische Links