Dateideskriptor

Aktualisiert: 13.03.2021 von Computer Hope

Abbildung von Dateideskriptoren

Ein Dateideskriptor ist eine Nummer, die eine geöffnete Datei im Betriebssystem eines Computers eindeutig identifiziert. Es beschreibt eine Datenressource und wie auf diese Ressource zugegriffen werden kann.

Wenn ein Programm eine Datei — oder eine andere Datenressource, wie einen Netzwerksocket — öffnen möchte, gewährt der Kernel:

  1. Zugriff.
  2. Erstellt einen Eintrag in der globalen Dateitabelle.
  3. Liefert der Software den Speicherort dieses Eintrags.

Der Deskriptor wird durch eine eindeutige nicht negative ganze Zahl identifiziert, z. B. 0, 12 oder 567. Für jede geöffnete Datei im System ist mindestens ein Dateideskriptor vorhanden.

Dateideskriptoren wurden zuerst in Unix verwendet und werden von modernen Betriebssystemen wie Linux, macOS und BSD verwendet. In Microsoft Windows werden Dateideskriptoren als Dateihandles bezeichnet.

Übersicht

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

Dateideskriptordiagramm

Stdin, stdout und stderr

Auf einem Unix-ähnlichen Betriebssystem sind die ersten drei Dateideskriptoren standardmäßig STDIN (Standardeingabe), STDOUT (Standardausgabe) und STDERR (Standardfehler).

Name Dateideskriptor Beschreibung Abkürzung
Standardeingabe 0 Der Standard-Datenstrom für die Eingabe, z. B. in einer Befehlspipeline. Im Terminal ist dies standardmäßig die Tastatureingabe des Benutzers. stdin
Standardausgabe 1 Der Standarddatenstrom für die Ausgabe, z. B. wenn ein Befehl Text ausgibt. Im Terminal ist dies standardmäßig der Bildschirm des Benutzers. stdout
Standardfehler 2 Der Standarddatenstrom für die Ausgabe, der sich auf einen aufgetretenen Fehler bezieht. Im Terminal ist dies standardmäßig der Bildschirm des Benutzers. stderr

Umleiten von Dateideskriptoren

Auf Dateideskriptoren kann direkt mit bash zugegriffen werden, der Standard-Shell von Linux, macOS X und Windows Subsystem für Linux.

Wenn Sie beispielsweise den Befehl find verwenden, geht die Ausgabe an stdout (Dateideskriptor 1) und Fehlermeldungen an stderr (Dateideskriptor 2). Beide Streams werden als Terminalausgabe angezeigt:

find / -name '*something*'
/usr/share/doc/something/usr/share/doc/something/examples/something_randomfind: `/run/udisks2': Permission deniedfind: `/run/wpa_supplicant': Permission denied/usr/share/something/usr/games/something

Wir erhalten Fehler, weil find versucht, einige Systemverzeichnisse zu durchsuchen, für die wir keine Leseberechtigung haben. Alle Zeilen mit der Aufschrift „Berechtigung verweigert“ wurden in stderr und die anderen Zeilen in stdout geschrieben.

Sie können stderr ausblenden, indem Sie den Dateideskriptor 2 nach /dev/null umleiten, dem speziellen Gerät unter Linux, das „nirgendwo hingeht“:

find / -name '*something*' 2>/dev/null
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something

Die an /dev/null gesendeten Fehler werden nicht angezeigt.

Es ist wichtig, den Unterschied zwischen stdout und stderr zu verstehen, wenn Sie mit der Ausgabe eines Programms arbeiten möchten. Wenn Sie beispielsweise versuchen, die Ausgabe des Befehls find zu grep , werden Sie feststellen, dass die Fehlermeldungen nicht gefiltert werden, da nur die Standardausgabe an grep weitergeleitet wird.

find / -name '*something*' | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_randomfind: `/run/udisks2': Permission deniedfind: `/run/wpa_supplicant': Permission denied/usr/share/something/usr/games/something

Sie können jedoch den Standardfehler auf die Standardausgabe umleiten, und dann verarbeitet grep den Text von beiden:

find / -name '*something*' 2>&1 | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something

Beachten Sie, dass im obigen Befehl die Zieldatei dem Deskriptor (1) wird ein kaufmännisches Und vorangestellt („&“). Weitere Informationen zur Datenstromumleitung finden Sie unter Pipelines in der Bash-Shell.

Beispiele für das Erstellen und Verwenden von Dateideskriptoren in bash finden Sie in unseren exec Builtin-Befehlsbeispielen.

Datei-Handle, Betriebssystem-Begriffe

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.