ein Kapitel zurück                                           ein Kapitel weiter

lseek ist das was im High-Level-Datei-I/O fseek ist und dient zum Verschieben des Dateizeigers in der geöffneten Datei mit dem Handle. Hier der Syntax von lseek...

#inlcude <unistd.h>    //für UNIX
#include <sys/types.h>    //für UNIX
#inlcude <io.h>    //für MS-DOS/WIN

long lseek(int handle, long offset, int wie);

Die Datei in der wir unseren Schreib-/Lesezeiger verschieben wollen geben wir mit dem Handle(Filedeskriptor) handle an, die wir natürlich zuvor mit open oder creat geöffnet bzw. erzeugt haben. Als offset geben wir an um wie viele Bytes wir unseren Lese-/Schreibzeiger vom der Position wie verschieben wollen. Die Angaben von wie sind die selben wie schon bei fseek. Hier nochmals die Tabelle welche vordefinierten Möglichkeiten sie haben...

wie-Angabe Beschreibung
SEEK_SET oder 0 Schreib-/Lesezeiger vom Dateianfang um offset Bytes versetzten.
SEEK_CUR oder 1 Schreib-/Lesezeiger von der aktuellen Position um offset Bytes versetzen.
SEEK_END oder 2 Schreib-/Lesezeiger vom Dateiende um offset Bytes versetzten.


Als Rückgabewert gibt diese Funktion den Wert der aktuellen Position des Schreib-/Lesezeigers zurück. z.B....

long aktuelle_position;
............................
aktuelle_position = lseek(handle, 0L, SEEK_CUR);

Bei Fehler gibt die Funktion -1 zurück. Sie sollten aber die Funktion lseek nicht auf ist <0 prüfen sondern auf ist -1, da es durchaus sein kann das es Gerätedateien gibt die einen negativen Wert liefern. Weiter Möglichkeiten von lseek...

Schreib-/Lesezeiger auf den Dateianfang setzen...

lseek(handle, 0L, SEEK_SET);

Schreib-/Lesezeiger um 100 Bytes von der aktuellen Position nach vorne versetzen...

lseek(handle, 100L, SEEK_CUR);

Schreib-/Lesezeiger um 10 Bytes von der aktuellen Position zurücksetzen....

lseek(handle, -10L, SEEK_CUR);

Schreib-/Lesezeiger auf das letzte Byte setzen (nicht EOF)...

lseek(handle, -1L, SEEK_END);

Zu diesem Thema will ich nur ein kleines Beispiel zeigen da lseek eigentlich genauso eingesetzt wird wie fseek...

/*Download:lseek1.c*/
#include <unistd.h> #include <stdio.h> #include <fcntl.h> int main() { int handle; char *meldung[3] ={"ram-size:", "vga-mode:", "root-device"}; handle = open("/vmlinuz",O_RDONLY); lseek(handle,504,0); short buffer; for(int i = 0; i<=2;++i) { read(handle,(char *)&buffer,sizeof (short)); printf("%s %d\n",meldung[i],buffer); } return 0; }

Den Pfad müssen sie gegebenfalls anpassen. Das Programm bewirkt das selbe wie das Kommando rdev unter Unix/Linux und ist auch nur auf diesem System ausführbar. Mit diesem Programm können wir für ein Kernelimage root-flags, ram-size, vga-mode und root-device die Werte auslesen die gesetzt sind.

Hinweis: Unter Linux kann es sein das bei älteren Programmen für...

SEEK_SET -> 0 oder L_SET
SEEK_CUR -> 1 oder L_INCR
SEEK_END -> 2 oder L_XTND

...vorfinden. Außerdem ist der Rückgabewert long nur für Systemen mit SVR1-3 gültig. SVR4 liefert den Primitiven Datentyp off_t zurück, der bei den meisten System auch long ist. BSD liefert hingegen einen int-Wert zurück.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf