lseek(2) lseek(2)
NAME
lseek, lseek64 - Schreib-/Lesezeiger positionieren
SYNTAX
#include <sys/types.h>
#include <unistd.h>
offt lseek(int fildes, offt offset, int whence);
off64t lseek64(int fildes, off64t offset, int whence);
BESCHREIBUNG
fildes ist ein Dateideskriptor, der von einem creat()-, open()-,
dup()- oder fcntl()-Systemaufruf zurückgegeben wird. lseek() setzt den
zu fildes gehörenden Schreib-/Lesezeiger wie folgt:
- Wenn whence SEEKSET ist, wird der Zeiger auf offset Bytes gesetzt.
- Wenn whence SEEKCUR ist, wird der Zeiger auf die aktuelle Position
plus offset gesetzt.
- Wenn whence SEEKEND ist, wird der Zeiger auf die Größe der Datei
plus offset gesetzt.
Bei Erfolg wird der sich ergebende Zeigerwert, gemessen in Bytes ab
Dateibeginn, durch lseek() zurückgegeben. Es ist zu beachten, daß in
den Fällen, in denen fildes der Dateideskriptor einer fernen Datei und
offset negativ ist, lseek() auch den Schreib-/Lesezeiger zurückgibt,
wenn dieser negativ ist.
lseek() erlaubt, daß der Schreib-/Lesezeiger hinter die existierenden
Daten der Datei gesetzt werden kann. Wenn später Daten an dieser
Stelle geschrieben werden, geben nachfolgende Lese-Operationen in der
Lücke zwischen dem vorherigen Ende der Daten und den neu eingegebenen
Daten solange Bytes vom Wert 0 zurück, bis Daten in die Lücke
geschrieben worden sind.
Es besteht kein funktionaler Unterschied zwischen lseek() und
lseek64(), außer bei der Interpretation von off64t [siehe lfs(5)].
FEHLER
Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
errno(5).
lseek() ist erfolglos, und der Schreib-/Lesezeiger bleibt unverändert,
wenn einer oder mehrere der nachstehenden Punkte zutreffen:
EBADF fildes ist kein offener Dateideskriptor.
ESPIPE fildes bezeichnet eine Pipe oder eine FIFO-Datei.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
lseek(2) lseek(2)
EINVAL whence ist nicht SEEKSET, SEEKCUR, oder SEEKEND. Der
Prozeß bekommt auch ein SIGSYS-Signal.
EINVAL fildes ist kein Dateideskriptor einer fernen Datei, und
der sich ergebende Dateizeiger würde negativ sein.
EOVERFLOW Der resultierende Datei-Offset würde ein Wert sein, der in
einem Objekt des Typs offt nicht korrekt dargestellt wer-
den kann.
Einige Geräte können nicht positionieren. Der Wert des Dateizeigers
für ein solches Gerät ist nicht definiert.
ERGEBNIS
Nach erfolgreicher Beendigung wird eine nicht negative ganze Zahl
zurückgegeben, die den Dateizeiger-Wert anzeigt. Andernfalls wird -1
zurückgegeben, und errno wird zur Anzeige des Fehlers gesetzt.
HINWEISE
lseek() schlägt fehl, wenn der resultierende Datei-Offset den höchsten
Wert überschreiten würde, der im entsprechenden, für den Aufruf ver-
wendeten Datentyp noch darstellbar ist. Hierbei wird die Variable
errno auf EOVERFLOW gesetzt (zugelassen von PASC Interpretation
1003.1-90 #75).
Normalerweise (jedoch nicht korrekterweise) überprüfen die Programme
den Rückgabewert dieser Funktion nicht, was die Fehlerausgabe mehr
oder weniger nutzlos macht. Auf der anderen Seite kann die Rückgabe
eines falschen Offsets auch zu schwerwiegenden Fehlfunktionen führen.
lseek()-Funktionen, die bis zum Ende der Datei ausgeführt werden und
lseek(fd, 0, SEEKEND);
verwenden, sind weitverbreitet. Leider schlagen diese Funktionen bei
einer zu großen Datei fehl, da der Rückgabewert normalerweise igno-
riert wird.
Eine weitere schwerwiegende Konsequenz, wenn der Rückgabewert von
lseek() ignoriert wird, liegt darin, daß Programme, die beim Erweitern
von Datendateien versuchen, den Zeiger über das Dateiende hinaus zu
verschieben, um anschließend die Daten zu schreiben, vorhandene Daten
überschreiben können.
Typische Implementierungen der Bibliotheken dbm und ndbm können bei-
spielsweise den folgenden Code enthalten:
(void) lseek(db->dbmpagf, blkno*PBLKSIZ, LSET);
if (write(db->dbmpagf, pagebuf, PBLKSIZ) != PBLKSIZ)
... error handling ...
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
lseek(2) lseek(2)
Das Problem hierbei ist, daß der Rückgabecode von lseek() nicht über-
prüft wird und lseek() daher fehlschlägt, wenn blkno*PBLKSIZ überläuft
(oder den Zeiger bis zu einem nicht vorgesehenen Offset verschiebt),
und die Daten bis zu einem nicht vorgesehenen Offset geschrieben wer-
den.
SIEHE AUCH
creat(2), dup(2), fcntl(2), open(2), unistd(4), lfs(5), types(5).
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98