pwrite(2) pwrite(2)
NAME
pwrite - Unteilbare Positionierungs- und Schreiboperation
SYNTAX
#include <unistd.h>
ssizet pwrite(int dk, const void *buf, sizet nbyte, offt offset);
BESCHREIBUNG
Der Systemaufruf pwrite() führt eine unteilbare Positionierungs- und
Schreiboperation durch. Dadurch entfällt die Notwendigkeit eines
Sperrmechanismus für den Fall, daß sowohl eine Positionierungs- als
auch eine Schreiboperation erforderlich ist und Dateideskriptoren
gemeinsam verwendet werden. pwrite() ist analog zu write(), akzeptiert
jedoch ein viertes Argument, offset. Die Schreiboperation erfolgt so,
als wäre zuvor der Systemaufruf lseek() bis offset (vom Dateianfang
aus) ausgeführt worden. Beachten Sie jedoch, daß der Systemaufruf
lseek() nicht wirklich ausgeführt wird (obwohl die Semantik analog
ist). pwrite() hat keinen Einfluß auf den Dateizeiger. Die nächsten
nbyte Bytes werden dann, angefangen beim angegebenen Offset, gelesen.
Die Unteilbarkeit der Positionierungs- und Schreiboperation bei
pwrite() ermöglicht es Prozessen und Threads, die Dateideskriptoren
gemeinsam verwenden, in eine gemeinsam verwendete Datei an einer
bestimmten Position zu schreiben, ohne daß hierfür ein Sperrmechanis-
mus erforderlich ist. Ein solcher Mechanismus wäre erforderlich, um
dasselbe Ergebnis über die getrennt ausgeführten Systemaufrufe lseek()
und write() zu erzielen. Die Unteilbarkeit der Positionierungs- und
Schreiboperation ist erforderlich, da der Dateizeiger gemeinsam ver-
wendet wird und ein Thread den Zeiger möglicherweise mit lseek() ver-
schiebt, nachdem ein anderer Prozeß einen Systemaufruf lseek() ausge-
führt hat, aber bevor write() ausgeführt wurde.
RÜCKGABEWERT
Bei erfolgreicher Beendigung gibt pwrite() die Anzahl Bytes zurück,
die tatsächlich aus buf gelesen wurden. 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 pwrite() fehlt und setzt errno auf
den angegebenen Wert:
EAGAIN Obligatorisches Sperren von Dateien und Dateisätzen ist
gesetzt, ONDELAY oder ONONBLOCK ist gesetzt, und eine blok-
kierende Datensatzsperre ist vorhanden.
EAGAIN Der Systemspeicher, der für "raw"-Ein-/Ausgabe zur Verfügung
steht, ist vorübergehend nicht ausreichend.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
pwrite(2) pwrite(2)
EAGAIN Es wurde versucht, in einen Stream zu schreiben, der bei
gesetztem Anzeiger ONDELAY oder ONONBLOCK keine Daten
akzeptieren kann.
EAGAIN Es wurde versucht, einen pwrite-Auftrag von PIPEBUF Bytes
oder weniger auf eine Pipe oder FIFO-Datei zu geben, und es
waren weniger als nbyte freier Speicherbereich vorhanden.
EBADF dk ist kein gültiger Dateideskriptor für eine zum Schreiben
geöffnete Datei.
EDEADLK Die pwrite()-Funktion schläft und löst dadurch einen Deadlock
aus.
EFAULT buf weist über den zugewiesenen Adreßraum des Prozesses hin-
aus.
EFBIG Es wurde versucht, in eine Datei zu schreiben, die über die
zulässige Grenze für den Prozeß oder die maximale Dateigröße
des Prozesses hinausgeht [siehe getrlimit(2) und ulimit(2)].
EINTR Ein Signal wurde während des Systemaufrufs pwrite() abgefan-
gen.
EINVAL Es wurde versucht, in einen Stream zu schreiben, der an einen
Multiplexer angeschlossen ist.
EIO Der Prozeß ist im Hintergrund und versucht, auf sein steuern-
des Terminal zu schreiben, dessen TOSTOP-Option gesetzt ist;
der Prozeß ignoriert weder SIGTTOU-Signale, noch blockiert er
sie, und seine Prozeßgruppe ist verwaist.
ENOLCK Die System-Datensatzsperren-Tabelle war voll, und daher kann
die pwrite()-Funktion erst schlafen, wenn die blockierende
Datensatzsperre aufgehoben wird.
ENOLINK dk ist auf einem fernen Rechner, und die Verbindung zu diesem
Rechner ist nicht mehr aktiv.
ENOSR Es wurde versucht, auf einen Stream mit ungenügend STREAMS-
Speicherplatz im System zu schreiben.
ENOSPC Während eines pwrite() in eine normale Datei ist kein freier
Speicher mehr auf dem Rechner.
ENXIO Ein Hangup ist aufgetreten, während in den Stream geschrieben
wird.
EPIPE Es wurde versucht, in eine Pipeline oder FIFO-Datei zu
schreiben, die nicht zum Lesen oder nur an einem Ende geöff-
net ist. Ein SIGPIPE-Signal wird an den Prozeß gesendet.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
pwrite(2) pwrite(2)
ERANGE Es wurde versucht, in einen Stream mit nbyte außerhalb der
vorgegebenen Mindest- und Höchstgrenzen zu schreiben, und der
Mindestwert ist ungleich Null.
ENOLCK Erzwungenes Satzsperren war erlaubt, und keine weiteren
Dateisatzsperren stehen zur Verfügung (zuviele Dateisegmente
gesperrt), weil das Maximum des Systems überschritten wurde.
SIEHE AUCH
creat(2), dup(2), fcntl(2), lseek(2), open(2), pread(2), write(2),
unistd(4).
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98