Galileo Computing < openbook >
Galileo Computing - Bücher zur Programmierung und Softwareentwicklung
Galileo Computing - Bücher zur Programmierung und Softwareentwicklung


'Wie werde ich Unix-Guru' als Buch bestellen
A. Willemer
Wie werde ich UNIX-Guru
I  ANWENDUNG
Know-How für Unix/Linux-User: Einführung, Shell, Befehle, Hilfe, Arbeit mit Dateien, Editoren, Reguläre Ausdrücke, nützliche Tools, Hardware.

II  ADMINISTRATION
Tools, Systemstart, Benutzer verwalten, Hardware konfigurieren, Software installieren, Datensicherung, Tuning, Kernel

III  NETZWERK
Client/Server Systeme, TCP/IP, Routing, IPv6, Internet-Dienste, DHCP, Webserver, Firewalls

IV  DAS X-WINDOW SYSTEM
Die grafische Oberfläche von UNIX einrichten und nutzen

V  PROGRAMMIERUNG VON SHELLSKRIPTEN
Automatisieren von Tasks durch Shell-Skripte.

VI  PERL
Interpreter, Syntax, Variablen, Steuerung, Funktionen, UNIX-Aufrufe, GUIs mit Tk

VII  PROGRAMMIERWERKZEUGE
C-Compiler, Analyse-Tools, CVS, yacc, diff

VIII  UNIX-SYSTEMAUFRUFE
UNIX-Befehle in eigenen Programmen nutzen

IX  LITERATUR
Weiterführende Literatur zu UNIX und LINUX

 
Galileo Computing / <openbook> / "Wie werde ich UNIX-Guru ?"
« Dateizugriffe Dateizugriffe Positionieren: lseek »

Unterabschnitte
  • Öffnen: open
  • Schließen: close
  • Lesen: read
  • Schreiben: write

Öffnen, Lesen und Schreiben

Um eine Datei lesen oder schreiben zu können, muss sie zunächst durch den Aufruf von open() geöffnet werden. Vor Ende des Programmes wird sie mit close() wieder geschlossen.

Öffnen: open

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(char *dateiname, int oflag, mode_t modus);

Die Parameter haben folgende Bedeutung:

  • [dateiname] Der Pfad und Dateiname der zu öffnenden Datei.
  • [oflag] Dieser Parameter bestimmt, wie die Datei geöffnet wird. Es können mehrere Attribute verwendet werden, indem sie mit einander durch den senkrechten Strich mit Oder verknüpft werden.

    [Dateiattribute bei open()]L|L Konstante & Bedeutung
    O_RDONLY & Datei nur zum Lesen öffnen
    O_WRONLY & Datei nur zum Schreiben öffnen
    O_RDWR & Datei zum Lesen und Schreiben öffnen
    O_APPEND & Es wird ans Ende der Datei angehängt
    O_CREAT & Erzeuge die Datei, wenn sie nicht existiert
    O_EXCL & Exklusiver Zugriff

  • [modus] Hier werden Schreib- und Leserechte angegeben, wie sie vom chmod bekannt sind.

Bei einem Fehler gibt open() -1 zurück. Der Fehlercode befindet sich in der globalen Variablen errno. Im Erfolgsfall wird ein Dateihandle vom Typ int zurückgegeben, der von den Dateifunktionen benötigt wird, um die entsprechende Datei weiter zu bearbeiten.

Das Flag O_APPEND ist vor allem beim Beschreiben von Protokolldateien wichtig. Beim Schreiben werden die Daten immer hinten an die Datei angehängt.

In einer Multitaskingumgebung wie UNIX ist diese Art der Positionierung besonders wichtig. Statt zunächst die Größe der Datei und daraus die Schreibposition zu ermitteln, reicht ein einzelner Aufruf von write() um zu schreiben. Damit ist die Operation untrennbar. Untrennbar bedeutet, dass die Operation beendet wird, bevor ein anderer Prozess dieselbe Operation ausführen kann. Ein paralleler Prozess, der auch schreiben will, kann also nur davor oder dahinter schreiben, aber nicht an die gleiche Stelle. Dagegen ist der scheinbar gleichwertige Ansatz mit lseek() und write() ohne O_APPEND als Parameter für open() teilbar, da es zwei Operationen sind. Dann können parallele Prozesse versehentlich in den gleichen Bereich schreiben.

Die Kombination O_CREAT | O_EXCL ist wunderbar zur Synchronisation mehrerer Prozesse verwendbar. Da ein solcher open() ein untrennbarer Aufruf ist, kann immer nur ein Prozess die Datei im Zugriff haben. Beispielsweise können Sie diese Technik verwenden, um zu vermeiden, dass zwei Prozesse gleichzeitig in einem kritischen Bereich arbeiten. Dazu wird zuvor versucht, eine Datei, die beispielsweise lock heißen kann, mit den oben angegebenen Parameter zu erzeugen. Der Aufruf misslingt, wenn bereits eine lock-Datei existiert. Derjenige, der also diesen Aufruf erfolgreich durchführen kann, ist also der einzige Prozess im kritischen Bereich. Nach Ende der Arbeiten löscht er einfach wieder die Datei lock und läutet damit die nächste Runde ein.

Statt dem Aufruf open() mit der Option O_CREAT können Sie auch creat() verwenden.

int creat(const char *dateiname, mode_t modus);

Zum Schließen der Datei wird der Aufruf close() verwendet.

Schließen: close

Der Aufruf von close() schließt die Datei wieder.

int close(int dateihandle);

Dass eine geöffnete Datei auch wieder geschlossen werden sollte, sagt Ihnen bereits Ihr Ordnungssinn. Darüber hinaus ist es einsehbar, dass bei vielen geöffneten Dateien der Verwaltungsaufwand für das Betriebssystem steigt. Der Hauptgrund, eine Datei möglichst bald wieder zu schließen, ist aber der, dass eine offene Datei immer ein Risiko darstellt, da der Zustand der Datei in der Schwebe ist.

Als Parameter wird close() das Dateihandle übergeben.

Der Rückgabewert ist 0, wenn alles in Ordnung ist und -1, wenn ein Fehler auftritt. In bestimmten Fällen kann ein Fehler in einer vom System gepufferten Schreiboperation erst beim Schließen der Datei auffallen. Insofern sollten Sie auch den Rückgabewert von close() prüfen, wenn Sie eine sichere Information brauchen, ob die Dateioperationen geklappt haben.

Lesen: read

Der Aufruf read() liest Daten aus einer geöffneten Datei.

#include <unistd.h>
int  read(int dateihandle, void *puffer, size_t laenge);

Damit aus einer Datei gelesen werden kann, muss sie geöffnet sein. Den Rückgabewert von open() braucht read() als ersten Parameter. Vor dem Lesen muss ein Puffer angelegt werden, in dem die zu lesenden Daten abgelegt werden. Die Adresse dieses Speichers wird als weiterer Parameter benötigt. Schließlich muss angegeben werden, wie groß der Datenblock sein soll, der gelesen wird. Dieser Parameter sollte nicht zu klein gewählt werden. Das byteweise Einlesen einer mittelgroßen Datei kann ein Programm minutenlang beschäftigen.

Der Rückgabewert gibt an, wieviele Bytes gelesen wurden und er sollte mit dem Parameter laenge übereinstimmen. Ist er kleiner, vermutet man leicht als Grund das Ende der Datei bzw. der Sendung. Da aber beispielsweise im Netz Verzögerungen auftreten können, sollten Sie auch in diesem Fall noch einmal lesen, bis der Rückgabewert 0 ist. Ist der Rückgabewert -1, ist ein Fehler aufgetreten. Nähere Informationen zu der Ursache des Fehlers finden Sie in der Variablen errno.

Schreiben: write

Mit dem Aufruf write() können Sie in eine geöffnete Datei schreiben.

#include <unistd.h>
int write(int dateihandle, void *puffer, size_t laenge);

Auch write() braucht das Dateihandle als ersten Parameter. Der zweite Parameter gibt die Adresse des Speichers an, aus dem geschrieben werden soll. Im letzten Parameter wird angegeben, wie viele Zeichen geschrieben werden sollen.

Der Rückgabewert ist wie bei read() normalerweise identisch mit dem Parameter laenge. Im Fehlerfall ist er -1 und die Variable errno gibt über die Ursache Auskunft.



« Dateizugriffe | Dateizugriffe | Positionieren: lseek »
 
 Zum Katalog
Zum Katalog
Wie werde ich UNIX-Guru?
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 UNIX/Linux

PHP 4-Workshop

Einstieg in Python

Perl fürs Web

MySQL 4

GNOME 2.0
 Empfehlung

Einstieg in XML
 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
Info

 MyGalileo
Der Service für registrierte Leser:
Zu MyGalileo
Info



Copyright © Galileo Press GmbH 2003
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.
[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de