2.2 Filedeskriptor
Mit den Funktionen der höheren Ebene (High Level) wird auf die Daten mit einem hohen Abstraktionsniveau zugegriffen. Das bedeutet, dass die Daten eines Programms formatiert ausgegeben oder eingelesen werden. Bei der niedrigeren Ebene (Low Level) wird auf einem tieferen Niveau gearbeitet. Der Zugriff auf die Daten erfolgt als eine Folge von unstrukturierten Bytes und bietet somit die Möglichkeit, Bytesequenzen vorgegebener Länge einzulesen oder auszugeben.
Nicht nur die Namen der Funktionen der höheren und der niedrigeren Ebene sind ähnlich, auch ihre Abarbeitung ist es, nur mit einem, aber sehr prinzipiellen Unterschied, der etwas verwirrend ist. Während beim High-Level-Dateizugriff mit einem FILE-Zeiger (Stream) auf die Datei (o. Ä.) zugegriffen wird, geschieht dies auf der niedrigeren Ebene mit einem so genannten Filedeskriptor. Dieser Deskriptor ist kein Zeiger wie bei der höheren Ebene, sondern ein normaler Integer-Wert, der beim Öffnen einer Datei zurückgegeben wird.
Der Filedeskriptor ist ein simpler Integer, der sich in einer bestimmten Tabelle von geöffneten Dateien befindet und der vom Kernel für jeden Prozess bereitgestellt wird. Die Werte 0, 1 und 2 sind vorbelegte Filedeskriptoren und ein Verweis auf die Standardeingabe (stdin), Standardausgabe (stdout) und Standardfehlerausgabe (stderr). Diese drei Streams sind meist mit dem Terminal (TTY) des Anwenders verbunden und können natürlich auch umgeleitet werden.
Sofern Sie einen der drei Standard-Filedeskriptoren verwenden wollen, empfiehlt es sich, eine von POSIX.1 festgelegte Konstante, die in <unistd. h.> definiert ist, zu verwenden. Es muss nämlich nicht gegeben sein, dass z. B. stdin tatsächlich 0 ist! Zwar ist dieser Fall mir noch nicht untergekommen, aber der Fall ist nicht unmöglich, denn sonst wäre der Standard anders.
Tabelle 2.2
Symbolische Konstanten für die Standard-Filedeskriptoren
Konstante in <unistd. h.>
|
Nummer
|
Bedeutung
|
STDIN_FILENO
|
0
|
Standardeingabe
|
STDOUT_FILENO
|
1
|
Standardausgabe
|
STDERR_FILENO
|
2
|
Standardfehlerausgabe
|
2.2.1 Verwaltung für offene Deskriptoren
Damit Sie im Verlauf des Kapitels alles verstehen, folgt eine kurze Beschreibung, wie Linux/UNIX einen geöffneten Filedeskriptor verwaltet. Folgende drei Tabellen verwendet der Kern, um geöffnete Dateien zu verwalten:
Prozesstabelleneintrag
In der Prozesstabelle befindet sich für jeden Prozess ein Eintrag. Dieser Eintrag wird auch Process Control Block (PCB) genannt. In einem solchen Eintrag befinden sich Dinge wie:
|
Ein Zeiger auf die … |
Speicherstelle, wo der ausführbare Code des Programms beginnt (Text)
Speicherstelle, wo die benötigten Daten im Speicher beginnen (Daten)
|
Prozesszustand (laufend, bereit, blockierend, beendet) |
|
Befehlszeiger, der die Adresse des nächsten Maschinenbefehls enthält |
|
Register – Jeder Eintrag muss den Inhalt aller CPU-Register zwischenspeichern, wenn der Prozess vom Arbeitenden in den arbeitsbereiten oder in den blockierenden Zustand versetzt wird. |
|
Speicherinformationen, welche die vom Prozess genutzten Seiten (Pages) enthalten |
|
Schedule-Informationen, worin die Prozesspriorität und ein Zeiger auf die Schedule-Warteschlange enthalten sind |
Dateitabelleneintrag
In der Dateitabelle befindet sich für jede geöffnete Datei ein Eintrag. Mehrere Einträge in Deskriptortabellen (auch von verschiedenen Prozessen) können wiederum auf den gleichen Eintrag in der Dateitabelle verweisen. Damit ist es auch möglich, dass verschiedene Prozesse nicht nur auf die gleiche Datei zugreifen, sondern sich auch gegenseitig beeinflussen können. Ein Eintrag in der Dateitabelle enthält die Nummer der Inodes (dessen Kopie, die im Hauptspeicher gehalten wird), die aktuelle Position, den Modus (lesen, schreiben, anhängen ...) usw. Natürlich können wiederum mehrere Einträge in der Dateitabelle auf den gleichen Inode verweisen – eine Datei kann auch gleichzeitig gelesen und geschrieben oder von mehreren Prozessen gleichzeitig geschrieben werden. Des Weiteren enthält ein Eintrag in der Dateitabelle einen Zeiger auf die v-node-Tabelle.
v-node-Tabelle
In einer v-node-Tabelle befinden sich Informationen über die Datei und Zeiger auf dateisystemabhängige Funktionen, die auf dieser Datei operieren. Neben den typischen v-node-Informationen findet man in dieser Tabelle auch noch die Inode-Information – wie Eigentümer, Zugriffsrechte, Benutzer- und Gruppennummer, Anzahl der Links usw. –, die beim Öffnen einer Datei in die v-node-Tabelle kopiert wird. Somit stehen auch diese Daten immer sofort zur Verfügung. Nebenbei ist in der v-node auch immer die aktuelle Dateigröße enthalten.
Hinweis Der Name v-node wurde vom Virtual File System (VFS) abgeleitet und stellt eine übergeordnete Schnittstelle im Kernel zwischen den einzelnen Filesystemen und dem Kernel da.
|
|