607 Stimmen

Was sind Dateideskriptoren, in einfachen Worten erklärt?

  1. Wie würde eine vereinfachte Beschreibung von Dateideskriptoren im Vergleich zu Wikipedia aussehen? Warum sind sie erforderlich? Nehmen wir Shell-Prozesse als Beispiel, und was bedeutet das für sie?

  2. Enthält eine Prozesstabelle mehr als einen Dateideskriptor. Wenn ja, warum?

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.

26voto

Sandeep_black Punkte 1122

Weitere Punkte zu File Descriptor :

  1. File Descriptors (FD) sind nichtnegative ganze Zahlen (0, 1, 2, ...) die mit geöffneten Dateien verbunden sind.

  2. 0, 1, 2 sind Standard FD der entspricht STDIN_FILENO , STDOUT_FILENO y STDERR_FILENO (definiert in unistd.h ), das beim Programmstart standardmäßig im Namen der Shell geöffnet wird.

  3. FD's werden in der sequentiellen Reihenfolge zugewiesen, d.h. der niedrigste mögliche nicht zugewiesene Integer-Wert.

  4. FD's für einen bestimmten Prozess sind zu sehen in /proc/$pid/fd (auf Unix-basierten Systemen).

19voto

Balu Punkte 209

Als Ergänzung zu anderen Antworten betrachtet Unix alles als Dateisystem. Ihre Tastatur ist eine Datei, die aus der Sicht des Kernels nur gelesen werden kann. Der Bildschirm ist eine schreibgeschützte Datei. In ähnlicher Weise werden auch Ordner, Eingabe- und Ausgabegeräte usw. als Dateien betrachtet. Immer wenn eine Datei geöffnet wird, z. B. wenn der Gerätetreiber [für Gerätedateien] ein open() anfordert oder ein Prozess eine Benutzerdatei öffnet, weist der Kernel einen Dateideskriptor zu, eine ganze Zahl, die den Zugriff auf diese Datei spezifiziert, z. B. nur lesen, nur schreiben usw. [als Referenz: https://en.wikipedia.org/wiki/Everything_is_a_file ]

1 Stimmen

Dateideskriptoren können sich auch auf Dinge beziehen, die nicht im Dateisystem existieren, wie anonyme Pipes und Netzwerk-Sockets.

15voto

Mahendra suthar Punkte 381

Datei-Deskriptoren

  • Für den Kernel sind alle geöffneten Dateien durch Dateideskriptoren gekennzeichnet.
  • Ein Dateideskriptor ist eine nicht-negative Ganzzahl.
  • Wenn wir eine bestehende Datei öffnen oder eine neue Datei erstellen, gibt der Kernel einen Dateideskriptor an einen Prozess zurück.
  • Wenn wir in einer Datei lesen oder schreiben wollen, identifizieren wir die Datei mit dem Dateideskriptor, der von open oder create zurückgegeben wurde, als Argument für Lesen oder Schreiben.
  • Jeder UNIX-Prozess verfügt über 20 Dateideskriptoren, die von 0 bis 19 durchnummeriert sind. bei vielen Systemen wurde die Zahl auf 63 erweitert.
  • Die ersten drei sind bereits geöffnet, wenn der Prozess beginnt 0: Die Standardeingabe 1: Die Standardausgabe 2: Die Standardfehlerausgabe
  • Wenn der Elternprozess einen Prozess aufspaltet, erbt der Kindprozess die Dateideskriptoren des Elternprozesses

11voto

Harsh Tripathi Punkte 21

Alle Antworten, die gegeben werden, sind großartig, hier ist meine Version --

Dateideskriptoren sind nicht-negative Ganzzahlen, die als abstrakter Zugriff auf "Dateien" oder E/A-Ressourcen (wie Pipes, Sockets oder Datenströme) dienen. Diese Deskriptoren helfen uns, mit diesen E/A-Ressourcen zu interagieren, und machen die Arbeit mit ihnen sehr einfach. Das E/A-System ist für einen Benutzerprozess als ein Strom von Bytes (E/A-Strom) sichtbar. Ein Unix-Prozess verwendet Deskriptoren (kleine Ganzzahlen ohne Vorzeichen), um auf E/A-Ströme zu verweisen. Die Systemaufrufe im Zusammenhang mit den E/A-Operationen nehmen einen Deskriptor als Argument.

Gültige Dateideskriptoren reichen von 0 bis zu einer maximalen Deskriptorenzahl, die konfigurierbar ist (ulimit, /proc/sys/fs/file-max). Der Kernel vergibt Deskriptoren für std input(0), std output(1) und std error(2) der FD-Tabelle. Wenn ein Datei-Öffnen nicht erfolgreich ist, gibt fd -1 zurück. FD

Wenn ein Prozess erfolgreich eine Datei öffnen will, gibt der Kernel einen Dateideskriptor zurück, der auf einen Eintrag in der globalen Dateitabelle des Kernels verweist. Der Eintrag in der Dateitabelle enthält Informationen wie den Inode der Datei, den Byte-Offset und die Zugriffsbeschränkungen für diesen Datenstrom (schreibgeschützt, schreibgeschützt, usw.).

5voto

In jedem Betriebssystem laufen Prozesse (p's), zum Beispiel p1, p2, p3 und so weiter. Jeder Prozess verwendet normalerweise laufend Dateien.

Jeder Prozess besteht aus einem Prozessbaum (oder einer Prozesstabelle, in einer anderen Formulierung).

Normalerweise stellen Betriebssysteme jede Datei in jedem Prozess von einem Nummer (d.h. in jedem Prozessbaum/jeder Tabelle).

Die erste Datei, die in diesem Prozess verwendet wird, ist Datei0 die zweite ist Datei1 die dritte ist Datei2 und so weiter.

Jede solche Nummer ist ein Dateideskriptor.

Dateideskriptoren sind normalerweise ganze Zahlen (0, 1, 2 und nicht 0,5, 1,5, 2,5).

Da wir Prozesse oft als "Prozesstabellen" beschreiben und Tabellen aus Zeilen (Einträgen) bestehen, können wir sagen, dass die Zelle des Dateideskriptors in jedem Eintrag den gesamten Eintrag darstellt.

Ähnlich verhält es sich mit einem Socket-Deskriptor, wenn Sie einen Netzwerk-Socket öffnen.

Bei einigen Betriebssystemen können die Dateideskriptoren knapp werden, aber ein solcher Fall ist extrem selten, und der durchschnittliche Computerbenutzer sollte sich deswegen keine Sorgen machen.

Dateideskriptoren könnten global sein (Prozess A beginnt z.B. in 0 und endet z.B. in 1; Prozess B beginnt z.B. in 2 und endet z.B. in 3) und so weiter, aber soweit ich weiß, sind Dateideskriptoren in modernen Betriebssystemen normalerweise nicht global, sondern prozessspezifisch (Prozess A beginnt z.B. in 0 und endet z.B. in 5, während Prozess B in 0 beginnt und z.B. in 10 endet).

0 Stimmen

Lesen Sie hier mehr über FD's in Linux: unix.stackexchange.com/questions/358022/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X