Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Linux-UNIX-Programmierung von Jürgen Wolf
Das umfassende Handbuch – 2., aktualisierte und erweiterte Auflage 2006
Buch: Linux-UNIX-Programmierung

Linux-UNIX-Programmierung
1216 S., mit CD, 49,90 Euro
Rheinwerk Computing
ISBN 3-89842-749-8
gp Kapitel 2 E/A-Funktionen
  gp 2.1 Elementare E/A-Funktionen
  gp 2.2 Filedeskriptor
    gp 2.2.1 Verwaltung für offene Deskriptoren
  gp 2.3 Funktionen, die den Filedeskriptor verwenden
    gp 2.3.1 Datei öffnen – open()
    gp 2.3.2 Anlegen einer neuen Datei – creat()
    gp 2.3.3 Datei schließen – close()
    gp 2.3.4 Schreiben von Dateien – write()
    gp 2.3.5 Lesen von Dateien – read()
    gp 2.3.6 Schreib-/Lesezeiger positionieren – lseek()
    gp 2.3.7 Duplizieren von Filedeskriptoren – dup() und dup2()
    gp 2.3.8 Ändern oder Abfragen der Eigenschaften eines Filedeskriptors – fcntl()
    gp 2.3.9 Record Locking – Sperren von Dateien einrichten
    gp 2.3.10 Multiplexing E/A – select()
    gp 2.3.11 Unterschiedliche Operationen – ioctl()
    gp 2.3.12 Lesen und Schreiben mehrerer Puffer – writev() und readv()
    gp 2.3.13 Übersicht zu weiteren Funktionen, die den Filedeskriptor verwenden
  gp 2.4 Standard-E/A-Funktionen
    gp 2.4.1 Der FILE-Zeiger
    gp 2.4.2 Öffnen und Schließen von Dateien
    gp 2.4.3 Formatierte Ausgabe
    gp 2.4.4 Formatierte Eingabe
    gp 2.4.5 Binäres Lesen und Schreiben
    gp 2.4.6 Zeichen- und zeilenweise Ein-/Ausgabe
    gp 2.4.7 Status der Ein-/Ausgabe überprüfen
    gp 2.4.8 Stream positionieren
    gp 2.4.9 Puffer kontrollieren
    gp 2.4.10 Datei löschen und umbenennen
    gp 2.4.11 Temporäre Dateien erstellen
  gp 2.5 Mit Verzeichnissen arbeiten
    gp 2.5.1 Ein neues Verzeichnis anlegen – mkdir()
    gp 2.5.2 In ein Verzeichnis wechseln – chdir(), fchdir()
    gp 2.5.3 Ein leeres Verzeichnis löschen – rmdir()
    gp 2.5.4 Format eines Datei-Eintrags in struct dirent
    gp 2.5.5 Einen Verzeichnisstream öffnen – opendir()
    gp 2.5.6 Lesen aus dem DIR-Stream – opendir() und Schließen des DIR-Streams – closedir()
    gp 2.5.7 Positionieren des DIR-Streams
    gp 2.5.8 Komplettes Verzeichnis einlesen – scandir()
    gp 2.5.9 Ganze Verzeichnisbäume durchlaufen – ftw()
  gp 2.6 Fehlerbehandlung
  gp 2.7 Ausblick


Rheinwerk Computing

2.2 Filedeskriptor  downtop

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


Rheinwerk Computing

2.2.1 Verwaltung für offene Deskriptoren  toptop

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:

gp  Ein Zeiger auf die …
Speicherstelle, wo der ausführbare Code des Programms beginnt (Text) Speicherstelle, wo die benötigten Daten im Speicher beginnen (Daten)
gp  Prozesszustand (laufend, bereit, blockierend, beendet)
gp  Befehlszeiger, der die Adresse des nächsten Maschinenbefehls enthält
gp  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.
gp  Speicherinformationen, welche die vom Prozess genutzten Seiten (Pages) enthalten
gp  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.


 << zurück
  
  Zum Rheinwerk-Shop
Neuauflage: Linux-UNIX-Programmierung
Neuauflage:
Linux-UNIX-
Programmierung

bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-
 Programmierung


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
Info





Copyright © Rheinwerk Verlag GmbH 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern