Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ lseek(2) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

creat(2)

dup(2)

fcntl(2)

open(2)

unistd(4)

lfs(5)

types(5)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026