Kapitel 2 E/A-Funktionen
Als Programmierer in GNU/Linux bzw. UNIX haben Sie zwei Möglichkeiten zur Auswahl, wenn es um die Ein-/Ausgabe (kurz E/A) von Daten geht. Das wären zum einen die Standard-C-Bibliothek, die Funktionen der höheren Ebene wie printf(), fopen(), fgets() etc. für Sie bereithält, und zum anderen die elementaren E/A-Funktionen der niedrigeren Ebene mit Funktionen wie open(), read() oder write(), die natürlich ebenso genormt sind.
Da dieses Buch keinen Anspruch erhebt, ein Linux-Einsteigerbuch zu sein, sind für dieses Kapitel grundlegende Kenntnisse des Linux-Dateisystems gefragt. Dies schließt mindestens folgende Punkte mit ein:
|
Umgang mit Dateien und Verzeichnissen – damit ist der Umgang mit grundlegenden Kommandos zur Verwaltung von Dateien und Verzeichnissen gemeint. |
|
Zugriffsrechte, Benutzer und Gruppenzugehörigkeit – Sie sollten mit den Hintergründen der Zugriffssicherung von Dateien und Verzeichnissen vertraut sein. |
|
Linux-Verzeichnisstruktur – »Wo bin ich gerade, und wo finde ich was«-Fragen in der Verzeichnisstruktur sollten Sie schon zu Grabe getragen haben. |
|
Verwaltung des Dateisystems – Sie sollten wissen, wie Sie auf die Festplatte als auch auf externe Datenträger (CD-ROM etc.) zugreifen können. |
2.1 Elementare E/A-Funktionen
Elementare E/A-Funktionen spielen in Linux/UNIX eine bedeutende Rolle u. a. beim Öffnen, Lesen und Schreiben von Dateien. Diese E/A-Funktionen sind allerdings nicht so bequem zu verwenden wie die Standard-E/A-Funktionen, da jeglicher Komfort wie z. B. die Pufferung fehlt.
Hinweis Die elementaren E/A-Funktionen werden von POSIX.1 und XPG5 vorgeschrieben, nicht aber vom ANSI C-Standard. Ich erwarte zwar in diesem Buch, dass der Leser sich bereits mit der Sprache C auseinander gesetzt hat, aber ich werde auch kurz die Standard-E/A-Funktionen zusammenfassen und vielleicht auf die eine oder andere Besonderheit in Bezug auf Linux hinweisen.
|
Häufiger werden unter Linux/UNIX die elementaren E/A-Funktionen eingesetzt, da viele von diesen so genannte Systemcalls (auch Syscalls) des Kernels sind und somit mehr die Systemfähigkeiten ausnutzen, weil sie eine Art direkte Schnittstelle zum System bieten. Natürlich sollte auch erwähnt werden, dass die elementaren E/A-Funktionen die Basis für die Standard-E/A-Funktionen darstellen. Also Standardfunktionen wie printf(), fputs(), putchar() oder putc() bauen alle auf der niedrigeren Ebene der elementaren Ausgabefunktionen auf, und Funktionen wie scanf(), fgets(), getchar() oder putc() verwenden die niedrigere Ebene der elementaren Eingabefunktionen.
Hinweis Natürlich können Sie sich nicht immer aussuchen, ob Sie jetzt Funktionen der niedrigeren Ebene oder der höheren Ebene verwenden. Manche Fälle lassen sich nur in der niedrigeren Ebene realisieren. Eine Verbindung zu einem Hardware-Gerät benötigt einen Filedeskriptor (mehr dazu gleich), ebenfalls ein geöffnetes Socket oder eine Pipe.
|
Um Sie jetzt mit den vielen Begriffen nicht zu verwirren, sprechen wir immer nur von zwei verschiedenen Arten der E/A-Funktionen, hierzu eine Tabelle zum Überblick.
Tabelle 2.1
… um den Überblick zu wahren
E/A-Funktionen
|
Ebene
|
Englischer Begriff
|
Standard
|
Elementar
|
niedrige Ebene
|
Low Level
|
POSIX.1, XPG5
|
Standard
|
höhere Ebene
|
High Level
|
ANSI C
|
Natürlich muss auch erwähnt werden, dass die so genannten Systemcalls, die von einem C-Programm gemacht werden, nicht DEN Systemcall darstellen, der ausgeführt wird. Z. B. stellt die Funktion open() nichts anderes als ein Wrapper für _syscallX(open ...) dar. Wird ein Systemcall ausgeführt, führt dies zu einem Kontextswitch wo der aufrufende Prozess mit dem Interrupt 0x80 vom User-Level zum Kernel-Level wechselt. Die zusätzlichen Parameter des Interrupts bestimmen dann den korrekten Systemcall.
Im Großen und Ganzen werden Sie als Linux-(System-)Programmierer recht wenig davon mit bekommen, da Ihnen die C-Bibliothek die Arbeiten mit den Systemcalls vollständig abnimmt. Um die Abarbeitung von Systemaufrufen (Systemcalls) besser zu verstehen, müssen Sie sich intensiver mit der Abarbeitung des Kernels befassen.
|