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