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
|
| |
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.
#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.
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.
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 .
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.
| |
|
|
Ihre Meinung? |
|
|
|
|
| |
| |
Shopping |
|
Versandkostenfrei bestellen in Deutschland und Österreich Info
|
|
| |
| |
|