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).
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