Ich habe mich gefragt, welche Unterschiede und Beziehungen zwischen Dateideskriptoren und Dateinamen bestehen. Werden sie alle verwendet, um auf Dateien zuzugreifen? Wenn ja, genauso?
Zum Beispiel /dev/fd/0
, /dev/stdin
und /proc/self/fd/0
sind alle Links zu /dev/pts/2
. Sind das vier Dateideskriptoren oder Dateinamen?
Antworten:
Alle vier
/dev/fd/0
,/dev/stdin
,/proc/self/fd/0
und/dev/pts/2
sind Dateinamen, wie sind/////dev/../dev/fd//0
,/bin/sh
,/etc/fstab
,/fioejfoeijf
, etc. Alles , aber das letzte Beispiel sind wahrscheinlich der Name einer vorhandenen Datei auf Ihrem Computer sein. Ein Dateiname ist eine Zeichenfolge, die eine Datei in Ihrem Dateisystem festlegen kann. Unter Linux ist jede Zeichenfolge, die kein Null-Byte enthält und höchstens 4096 Byte lang ist, ein gültiger Dateiname. Viele dieser Namen sind gleichwertig, zB/bin/sh
entspricht///bin/sh
,/bin/../bin/sh
(vorausgesetzt ,/bin
ein bestehendes Verzeichnis wird) usw. Alle Beispiele , die ich gegeben habe , so weit sind absolute Dateinamen; Es gibt auch relative Dateinamen, die nicht mit a beginnen/
und deren Bedeutung vom aktuellen Verzeichnis abhängt.Die Terminologie für Dateinamen ist nicht universell. Manchmal bedeutet "Dateiname" einen vollständigen Pfad zu einer Datei, und manchmal bedeutet es den Namen eines Verzeichniseintrags. Die POSIX-Terminologie lautet " Dateiname " oder " Pfadname-Komponente " für den Namen eines Verzeichniseintrags und " Pfadname " für einen vollständigen Pfad.
Ein Dateideskriptor bezeichnet eine geöffnete Datei in einem bestimmten Prozess. Der Kernel verwaltet für jeden Prozess eine Tabelle mit Dateideskriptoren. Jeder Eintrag in der Dateideskriptortabelle gibt an, was zu tun ist, wenn der Prozess Lese-, Schreib- und andere Vorgänge für den Dateideskriptor anfordert.
Dateideskriptoren entsprechen möglicherweise einer Datei und haben einen zugeordneten Namen, aber nicht alle. Für diejenigen, die dies tun, kann die Datei eine reguläre Datei, ein Verzeichnis, eine Gerätedatei oder eine Named Pipe (auch FIFO genannt) sein (die Art, die von erstellt wurde
mkfifo
); Einige Systeme bieten weitere Möglichkeiten wie Unix-Sockel und Türen. Beispiele für Dateibeschreibungen , die nicht enthalten eine zugehörige Datei mit dem Namen haben Rohre (die Art von der erstelltpipe
) und Netzwerk - Sockets ./dev/fd/0
,/dev/stdin
Und/proc/self/fd/0
sind Dateinamen (all - Äquivalent) mit einer besonderen Bedeutung: sie alle designierten je nachdem welche Datei gerade über Dateideskriptor zugegriffen wird 0. Wenn ein Verfahren zur Herstellung dieser geöffnet wird, die Kernel - Kopien der Eintrag mit dem Index 0 in dem Dateideskriptor Deskriptortabelle zu einem neuen Deskriptor. Das Öffnen einer dieser Dateien entspricht dem Aufrufendup(0)
. Die genannten Dateien sind eine Möglichkeit, einen Prozess indirekt dazu zu bringen, eine seiner bereits geöffneten Dateien zu verwenden, anstatt eine neue Datei zu öffnen. Sie sind meistens nützlich, um die Befehlszeile eines Programms weiterzuleiten, in der das Programm erwartet, dass der Name einer Datei geöffnet wird.quelle
Dateiname ist nur ein Name der Datei im Dateisystem, nichts weiter - es ist nur eine Zeichenfolge.
Der Dateideskriptor ist eine Art Objekt, von dem aus Sie lesen und / oder schreiben können. Das ist geöffnete und fertige Datei. Es gibt nicht nur Dateideskriptoren - stdin, stdout und stderr sind auch Deskriptoren. Sie können mit absolut denselben Funktionen wie bei Dateien aus ihnen schreiben und lesen (außer Sie können beispielsweise nicht suchen). Andere Beispiele für Deskriptoren, die keine Dateien sind, sind: Named Pipes und Network Sockets.
Im Code ist der Dateideskriptor eine Variable, die auf etwas im Kernel verweist, das ein Dateiobjekt darstellt.
Dies sind alles Pseudodateien, die für einige Skripte oder Programme nützlich sein können. Sie können sie öffnen und open () gibt Ihnen einen Dateideskriptor zurück.
quelle