Dateideskriptor vs. Dateiname

12

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/stdinund /proc/self/fd/0sind alle Links zu /dev/pts/2. Sind das vier Dateideskriptoren oder Dateinamen?

Tim
quelle
stackoverflow.com/questions/33495283/…
Ciro Santilli 事件 改造 中心 法轮功 法轮功 事件

Antworten:

12

Alle vier /dev/fd/0, /dev/stdin, /proc/self/fd/0und /dev/pts/2sind 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/shentspricht ///bin/sh, /bin/../bin/sh(vorausgesetzt , /binein 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 erstellt pipe) und Netzwerk - Sockets .

/dev/fd/0, /dev/stdinUnd /proc/self/fd/0sind 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 Aufrufen dup(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.

Gilles 'SO - hör auf böse zu sein'
quelle
@Giles Sie haben geschrieben: "Jeder Eintrag in der Dateideskriptortabelle gibt an, was zu tun ist, wenn der Prozess das Lesen, Schreiben und andere Vorgänge für den Dateideskriptor anfordert." ( Hervorhebung meiner). Soweit ich verstanden habe, handelt es sich lediglich um eine Ganzzahl wie die Norm 0,1,2 usw. für stdin, stdout bzw. stderr. Es wären höherwertige Zahlen für reguläre Dateien. Was ich aus Ihrem Kommentar nicht erhalte, ist, wie diese Nummer angibt, "was zu tun ist, wenn der Prozess das Lesen, Schreiben und andere Operationen am Dateideskriptor anfordert". . Können Sie das bitte etwas näher erläutern?
Geek
@Geek Ein Eintrag in der Dateideskriptortabelle ist keine Zahl. Die Nummer ist der Index in dieser Tabelle.
Gilles 'SO - hör auf böse zu sein'
@ Giles danke für die Klärung meines Missverständnisses. Ich verstehe es jetzt besser. Können Sie bitte ein Beispiel dafür geben, was in Ihrer Antwort zu tun ist? Ich habe festgestellt, dass jeder Eintrag in der Dateideskriptortabelle wieder einen Zeiger auf eine Dateitabelle enthält, die Informationen wie Dateiversatz, Dateistatus usw. enthält. Ich bin mir jedoch immer noch nicht sicher, was in Ihrer Antwort zu tun ist.
Geek
2

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.

Zum Beispiel sind / dev / fd / 0, / dev / stdin, / proc / self / fd / 0 alle Links zu / dev / pts / 2. Sind das vier Dateideskriptoren oder Dateinamen?

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.

rvs
quelle