Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ pread(2) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

lseek(2)

pwrite(2)

read(2)

unistd(4)

pread(2)                                                           pread(2)

NAME
     pread - Unteilbare Positionierungs- und Leseoperation

SYNTAX
     #include <unistd.h>

     ssizet read(int fildes, void *buf, sizet nbyte, offt offset);

BESCHREIBUNG
     Der Systemaufruf pread() führt eine unteilbare Positionierungs- und
     Leseoperation durch. Dadurch entfällt die Notwendigkeit eines Sperrme-
     chanismus für den Fall, daß sowohl eine Positionierungs- als auch eine
     Leseoperation erforderlich ist und Dateideskriptoren gemeinsam verwen-
     det werden. pread() ist analog zu read(), akzeptiert jedoch ein vier-
     tes Argument, offset. Die Leseoperation erfolgt so, als wäre zuvor der
     Systemaufruf lseek() bis offset (vom Dateianfang aus) ausgeführt wor-
     den. Beachten Sie jedoch, daß der Systemaufruf lseek() nicht wirklich
     ausgeführt wird (obwohl die Semantik analog ist). pread() hat keinen
     Einfluß auf den Dateizeiger. Die nächsten nbyte Bytes werden dann,
     angefangen beim angegebenen Offset, gelesen.

     Die Unteilbarkeit der Positionierungs- und Leseoperation bei pread()
     ermöglicht es Prozessen und Threads, die Dateideskriptoren gemeinsam
     verwenden, eine gemeinsam verwendete Datei an einer bestimmten Posi-
     tion zu lesen, ohne daß hierfür ein Sperrmechanismus erforderlich ist.
     Ein solcher Mechanismus wäre erforderlich, um dasselbe Ergebnis über
     die getrennt ausgeführten Systemaufrufe lseek() und read() zu erzie-
     len. Die Unteilbarkeit der Positionierungs- und Leseoperation ist
     erforderlich, da der Dateizeiger gemeinsam verwendet wird und ein
     Thread den Zeiger möglicherweise über lseek() verschiebt, nachdem ein
     anderer Prozeß einen Systemaufruf lseek() ausgeführt hat, jedoch bevor
     read() ausgeführt wurde.

RÜCKGABEWERT
     Bei erfolgreicher Beendigung gibt pread() die Anzahl Bytes zurück, die
     tatsächlich gelesen und in buf gestellt wurden. Der Wert 0 wird
     zurückgegeben, wenn das Dateiende erreicht wurde. Andernfalls wird der
     Wert -1 und ein Fehler zurückgegeben.

FEHLER
     Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
     Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
     errno(5).

     Unter folgenden Bedingungen schlägt pread() fehlt und setzt errno auf
     den angegebenen Wert:

     EAGAIN   Obligatorisches Sperren von Dateien und Dateisätzen war
              gesetzt, ONONBLOCK war gesetzt, und eine blockierende Datei-
              satzsperre war vorhanden.





Seite 1                      Reliant UNIX 5.44               Gedruckt 11/98

pread(2)                                                           pread(2)

     EAGAIN   Der Systemspeicher, der für "raw"-Ein/Ausgabe zur Verfügung
              steht, ist vorübergehend nicht ausreichend.

     EAGAIN   In einer mit einem TTY-Gerät verbundenen Datei warten keine
              Daten darauf, gelesen zu werden, und ONONBLOCK ist gesetzt.

     EAGAIN   In einem Stream wartet keine Nachricht darauf, gelesen zu
              werden, und der Anzeiger ONONBLOCK ist gesetzt.

     EBADF    fildes ist kein gültiger Dateideskriptor, der zum Lesen
              geöffnet ist.

     EBADMSG  Die Nachricht, die in einem Stream darauf wartet, gelesen zu
              werden, ist keine Datennachricht.

     EDEADLK  pread() würde in einen schlafenden Zustand gehen und dadurch
              einen Deadlock verursachen.

     EFAULT   buf weist über den zugewiesenen Adreßraum hinaus.

     EINTR    Ein Signal wurde während des pread()-Systemaufrufs abgefan-
              gen, und zwar bevor irgendwelche Daten gelesen wurden.

     EINVAL   Es wurde versucht, von einem Stream zu lesen, der mit einem
              Multiplexer verbunden ist.

     EIO      Ein physischer Ein-/Ausgabefehler ist aufgetreten. Oder der
              Prozeß ist in einer Prozeßgruppe im Hintergrund und versucht
              von seinem steuernden Terminal zu lesen, und entweder igno-
              riert oder blockiert der Prozeß das Signal SIGTTIN, oder die
              Prozeßgruppe des Prozesses hat keinen Vaterprozeß.

     ENOLCK   Die Tabelle der Systemdatensatzsperren war voll, daher konnte
              pread() erst schlafen, nachdem die blockierende Datensatz-
              sperre aufgehoben wurde.

     ENOLINK  fildes liegt auf einem fernen Rechner, und die Verbindung zu
              diesem Rechner ist nicht mehr aktiv.

     ENXIO    Das mit fildes verbundene Gerät ist eine block- oder zeichen-
              orientierte Gerätedatei, und der Schreib-/Lesezeiger ist
              außerhalb des Gültigkeitsbereichs.

     Ein pread() von einer STREAMS-Datei ist auch dann erfolglos, wenn am
     Stream-Kopf eine Fehlermeldung empfangen wird. In diesem Fall wird
     errno auf den Wert gesetzt, der in der Fehlermeldung zurückgegeben
     wird. Bei Auftreten eines Hangups im Stream, der gerade gelesen wird,
     läuft pread() normal weiter, bis die Lesewarteschlange des Stream-
     Kopfes entleert ist. Danach wird 0 zurückgegeben.





Seite 2                      Reliant UNIX 5.44               Gedruckt 11/98

pread(2)                                                           pread(2)

HINWEISE
     pread() aktualisiert die Zeit des letzten Dateizugriffs [siehe
     stat(2)].

SIEHE AUCH
     lseek(2), pwrite(2), read(2), unistd(4).
















































Seite 3                      Reliant UNIX 5.44               Gedruckt 11/98

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