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.

5voto

sumitsinghdeode Punkte 401

Ergänzung zu den oben genannten vereinfachten Antworten.

Wenn Sie mit Dateien in einem Bash-Skript arbeiten, ist es besser, einen Dateideskriptor zu verwenden.

Zum Beispiel: Wenn Sie von der Datei "test.txt" lesen und in sie schreiben wollen, verwenden Sie den Dateideskriptor wie unten gezeigt:

FILE=$1 # give the name of file in the command line
exec 5<>$FILE # '5' here act as the file descriptor

# Reading from the file line by line using file descriptor
while read LINE; do
    echo "$LINE"
done <&5

# Writing to the file using descriptor
echo "Adding the date: `date`" >&5 
exec 5<&- # Closing a file descriptor

0 Stimmen

Warum müssen wir einen FD verwenden, wenn wir einfach die Datei selbst an die while-Schleife übergeben können?

1 Stimmen

Was bewirkt das exec 5<>$FILE, insbesondere das <>, in anderen Tutorials sehe ich nur <, aber ich denke, dass die Verwendung von <> eine Dateierstellung verhindert, was besser zu sein scheint, aber ich bin nicht sicher, was es hier genau bewirkt.

5voto

swayamraina Punkte 2624

Dateideskriptoren sind nichts anderes als Verweise für jede offene Ressource. Sobald Sie eine Ressource öffnen, geht der Kernel davon aus, dass Sie einige Operationen mit ihr durchführen werden. Die gesamte Kommunikation zwischen Ihrem Programm und der Ressource erfolgt über eine Schnittstelle, und diese Schnittstelle wird durch den Dateideskriptor bereitgestellt.

Da ein Prozess mehr als eine Ressource öffnen kann, ist es möglich, dass eine Ressource mehr als einen Dateideskriptor hat.
Sie können alle mit dem Prozess verknüpften Datei-Deskriptoren anzeigen, indem Sie einfach den Befehl ausführen, ls -li /proc/<pid>/fd/ hier ist pid die Prozess-ID Ihres Prozesses

0 Stimmen

> "Da ein Prozess mehr als eine Ressource öffnen kann, ist es möglich, dass eine Ressource mehr als einen Datei-Deskriptor hat." - Dies ist kein richtiger Ursache-Wirkung-Satz...

0voto

Sidney Punkte 1099

<sup>Ich kenne den Kernel-Code nicht, aber ich werde hier meinen Senf dazugeben, da ich seit einiger Zeit darüber nachdenke, und ich denke, dass es nützlich sein wird.</sup>

Wenn Sie eine Datei öffnen, gibt der Kernel einen Dateideskriptor zurück, um mit dieser Datei zu interagieren.

Ein Dateideskriptor ist eine Implementierung einer API für die Datei, die Sie öffnen. Der Kernel erstellt diesen Dateideskriptor, speichert ihn in einem Array und gibt ihn an Sie weiter.

Diese API erfordert eine Implementierung, die es Ihnen ermöglicht, die Datei zu lesen und zu schreiben, zum Beispiel.

Denken Sie noch einmal darüber nach, was ich gesagt habe, und denken Sie daran, dass alles eine Datei ist - Drucker, Monitore, HTTP-Verbindungen usw.

Das ist meine Zusammenfassung nach der Lektüre https://www.bottomupcs.com/file_descriptors.xhtml .

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