read(2) read(2)
NAME
read, readv - Aus einer Datei lesen
SYNTAX
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
ssizet read(int fildes, void *buf, sizet nbyte);
ssizet readv(int fildes, const struct iovec *iov, int iovcnt);
BESCHREIBUNG
read() versucht, nbyte Bytes von der zu fildes gehörenden Datei in den
Puffer zu lesen, auf den buf zeigt. Wenn nbyte Null ist, gibt read()
Null zurück und hat keine anderen Auswirkungen. fildes ist ein Datei-
deskriptor, der von einem der Systemaufrufe creat(), open(), dup(),
fcntl() oder pipe() geliefert wird.
Bei Geräten, die positionieren können, beginnt read() an der Stelle in
der Datei, die von dem zu fildes gehörenden Schreib-/Lesezeiger ange-
geben wird. Nach der Rückkehr von read() wird der Schreib-/Lesezeiger
um die Anzahl der tatsächlich gelesenen Bytes erhöht.
Geräte, die nicht positionieren können, lesen immer von der aktuellen
Position an. Der Wert eines zu einer solchen Datei gehörenden
Schreib-/Lesezeigers ist nicht definiert.
readv() macht dasselbe wie read(), aber hier werden die Eingabedaten
in die iovcnt-Puffer gestellt, die durch die Elemente des Arrays iov
spezifiziert sind: iov[0], iov[1], ..., iov[iovcnt-1].
Für readv() enthält die Struktur iovec folgende Komponenten:
addrt iovbase;
sizet iovlen;
Jeder iovec-Eintrag gibt die Basisadresse und Länge eines Speicherbe-
reichs an, in den Daten gestellt werden sollen. readv() füllt einen
Puffer immer vollständig, bevor zum nächsten übergegangen wird.
Bei Erfolg geben read() und readv() die Anzahl der tatsächlich gelese-
nen und in den Puffer geschriebenen Bytes zurück; diese Zahl kann
kleiner als nbyte sein, wenn die Datei zu einer Datenübertragungslei-
tung gehört [siehe ioctl(2) und termio(7)], oder wenn die Anzahl der
in der Datei vorhandenen Bytes kleiner als nbyte Bytes ist, oder wenn
die Datei eine Pipe oder Gerätedatei ist. Bei Erreichen des Dateiendes
wird 0 zurückgegeben.
Wenn der Wert von nbyte größer als SSIZEMAX ist, ist das Ergebnis
nicht definiert.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
read(2) read(2)
read() liest Daten, die vorher in eine Datei geschrieben worden sind.
Wenn ein Teil einer regulären Datei vor dem Dateiende nicht geschrie-
ben worden ist, gibt read() die Anzahl der als 0 gelesenen Bytes
zurück. Zum Beispiel erlaubt die Routine lseek(), daß der Schreib-
/Lesezeiger hinter das Ende der vorhandenen Daten in der Datei gesetzt
wird. Wenn an diesen Punkt zusätzliche Daten geschrieben werden, geben
aufeinanderfolgende read()-Aufrufe in der Lücke zwischen dem vorher-
igen Datenende und den neu geschriebenen Daten Bytes mit einem Wert
von 0 zurück, bis Daten in die Lücke geschrieben worden sind.
Ein read() oder readv() von einer STREAMS-Datei kann in drei verschie-
denen Modi arbeiten: byte-stream (byteweise), message-nondiscard (Mel-
dung nicht löschen) und message-discard (Meldung löschen). Der Modus
byte-stream ist Standard. Dieser kann mit der Anforderung ISRDOPT
ioctl [siehe streamio(7)] geändert und mit IGRDOPT ioctl getestet
werden. Im byte-stream-Modus rufen read() und readv() normalerweise
Daten vom Stream ab, bis sie nbyte Bytes geholt haben, oder bis keine
weiteren Daten mehr zum Abrufen vorhanden sind. Meldungsgrenzen werden
im allgemeinen ignoriert.
Im Modus message-nondiscard rufen read() und readv() Daten ab, bis
nbyte Bytes gelesen sind oder bis eine Meldungsgrenze erreicht wird.
Wenn read() oder readv() nicht alle Daten in einer Meldung abrufen,
werden die übrigen Daten in den Stream zurückgestellt und können vom
nächsten read()- oder readv()-Aufruf abgerufen werden. Im Modus
message-discard werden ebenfalls Daten abgerufen, bis nbyte Bytes
abgerufen sind oder eine Meldungsgrenze erreicht wird. Jedoch werden
nicht gelesene Daten, die in einer Meldung zurückbleiben, gelöscht und
stehen für ein anschließendes read(), readv() oder getmsg() [siehe
getmsg(2)] nicht mehr zur Verfügung.
Wenn von einer regulären Datei gelesen wird, bei der Dateisperren
gesetzt sind [siehe chmod(2)] und eine von einem anderen Prozeß
gesetzte Schreibsperre auf dem Dateisegment liegt, hat dies folgende
Auswirkung:
- Wenn ONONBLOCK gesetzt ist, gibt read() -1 zurück und setzt errno
auf EAGAIN.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
read(2) read(2)
- Wenn ONONBLOCK nicht gesetzt ist, schläft read(), bis die blockie-
rende Dateisatzsperre aufgehoben wird.
Wenn versucht wird, von einer leeren Pipe oder einer FIFO-Datei zu
lesen, hat das folgende Auswirkung:
- Wenn kein Prozeß die Pipe zum Schreiben geöffnet hat, gibt read() 0
zurück, um das Dateiende anzuzeigen.
- Wenn ein Prozeß die Pipe zum Schreiben geöffnet hat und ONONBLOCK
gesetzt ist, gibt read() -1 zurück und setzt errno auf EAGAIN.
- Wenn ONONBLOCK nicht gesetzt ist, blockiert read(), bis Daten in
die Pipe geschrieben werden, oder bis die Pipe von allen Prozessen,
die sie zum Schreiben geöffnet hatten, geschlossen worden ist.
Wenn versucht wird, eine Datei zu lesen, die einem Terminal zugeordnet
ist, das zur Zeit keine Daten verfügbar hat, hat das folgende Auswir-
kung:
- Wenn ONONBLOCK gesetzt ist, gibt read() -1 zurück und setzt errno
auf EAGAIN.
- Wenn ONONBLOCK nicht gesetzt ist, blockiert read(), bis Daten ver-
fügbar werden.
Wenn versucht wird, eine Datei zu lesen, die zu einem Stream gehört,
der weder eine Pipe noch eine FIFO- oder eine Terminal-Datei ist und
der zum gegebenen Zeitpunkt keine Daten verfügbar hat, hat das fol-
gende Auswirkung:
- Wenn ONONBLOCK gesetzt ist, gibt read() -1 zurück und setzt errno
auf EAGAIN.
- Wenn ONONBLOCK frei ist, blockiert read() solange, bis Daten ver-
fügbar werden.
Beim Lesen aus einer STREAMS-Datei wird die Bearbeitung der leeren
Meldungen durch die aktuelle Einstellung des Lesemodus bestimmt. Im
byte-stream-Modus akzeptiert read() Daten, bis nbyte Bytes gelesen
worden sind, bis keine weiteren Daten mehr zu lesen sind oder bis eine
leere Meldung angetroffen wird. read() gibt dann die Anzahl der gele-
senen Bytes zurück und setzt die leere Meldung in dem Stream zurück,
wo sie vom nächsten read() oder getmsg() [siehe getmsg(2)] abgerufen
werden kann. In den beiden anderen Modi gibt eine leere Meldung einen
Wert von 0 zurück, und die Meldung wird aus dem Stream entfernt. Wenn
eine leere Meldung als erste Meldung in einem Stream gelesen wird,
erfolgt unabhängig vom jeweiligen Lesemodus die Rückgabe des Wertes 0.
Ein read() oder readv() einer STREAMS-Datei gibt die Daten in der
ersten Meldung aus der Lesewarteschlange des Stream-Kopfes zurück,
unabhängig von der Priorität der Meldung.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
read(2) read(2)
Normalerweise kann ein read() von einer STREAMS-Datei nur Datenmeldun-
gen ohne Steuerinformationen verarbeiten. read() scheitert, wenn eine
Meldung mit Steuerinformationen im Stream-Kopf angetroffen wird. Die-
ses standardmäßige Verhalten kann verändert werden, indem man den
Stream mit Hilfe von ISRDOPT ioctl in den Steuerdatenmodus oder in
einen Modus versetzt, bei dem alle Steuerinformationen gelöscht wer-
den. Im Steuerdatenmodus werden die Steuerdaten in normale Daten kon-
vertiert und können mit read gelesen werden. Im anderen Fall werden
die Steuerdaten von read() gelöscht. Mit diesen Meldungen zusammenhän-
gende normale Daten können aber trotzdem gelesen werden.
Bei regulären Dateien erfolgt kein Datentransfer über das Offset-
Maximum hinaus, das in der fildes zugeordneten internen Beschreibung
der offenen Datei festgelegt ist.
read() und readv() führen aufgrund des Offset-Maximums möglicherweise
ein "partielles Lesen oder Schreiben" aus. Dies bedeutet, daß der
zurückgegebene Wert möglicherweise unter nbyte liegt, wenn die Anzahl
der verbleibenden Bytes, die übertragen werden kann, unter nbyte
liegt.
FEHLER
Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
errno(5).
read() und readv() sind erfolglos, wenn einer oder mehrere der nach-
stehenden Punkte zutreffen:
EAGAIN Obligatorisches Sperren von Dateien und Dateisätzen war
gesetzt, ONONBLOCK war gesetzt, und eine blockierende
Dateisatzsperre war vorhanden.
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 Meldung darauf, gelesen zu
werden, und ONONBLOCK ist gesetzt.
EBADF fildes ist kein gültiger Dateideskriptor, der zum Lesen
geöffnet ist.
EBADMSG Die Meldung, die in einem Stream darauf wartet, gelesen zu
werden, ist keine Datenmeldung.
EDEADLK read() würde in einen schlafenden Zustand gehen und
dadurch einen Deadlock (gegenseitige Sperre) verursachen.
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
read(2) read(2)
EFAULT buf weist über den zugewiesenen Adreßraum hinaus.
EINTR Ein Signal wurde während des Systemaufrufs read() oder
readv() abgefangen, 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 Steuerungsterminal zu lesen, und ent-
weder ignoriert oder blockiert der Prozeß das Signal
SIGTTIN, oder die Prozeßgruppe des Prozesses hat keinen
Vaterprozeß.
ENOLCK Die Tabelle der System-Datensatzsperren war voll, daher
konnte read() oder readv() erst schlafen, nachdem die
blockierende Datensatzsperre 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 zei-
chenorientierte Gerätedatei, und der Schreib-/Lesezeiger
ist außerhalb des Gültigkeitsbereichs.
EISDIR Das Argument fildes verweist auf ein Verzeichnis, die
Implementierung läßt das Lesen dieses Verzeichnisses mit
read() oder readv() jedoch nicht zu. Die Funktion read-
dir() sollte statt dessen verwendet werden.
EOVERFLOW Die Datei ist eine reguläre Datei, nbyte ist größer als 0,
die Anfangsposition liegt vor dem Dateiende und ist größer
oder gleich dem Offset-Maximum, das in der fildes zugeord-
neten internen Beschreibung der offenen Datei festgelegt
ist.
Zusätzlich kann readv() einen der folgenden Fehler zurückgeben:
EFAULT iov weist über den zugewiesenen Adreßraum des Prozesses
hinaus.
EINVAL iovcnt war kleiner oder gleich 0 oder größer als 16.
EINVAL Die Summe der iovlen-Werte im iov-Array brachte eine 32-
Bit-Ganzzahl zum Überlauf.
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
read(2) read(2)
Ein read() 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 read() normal weiter, bis die Lesewarteschlange des Stream-
Kopfes leer ist. Danach wird 0 zurückgegeben.
ERGEBNIS
Bei Erfolg wird eine nicht negative ganze Zahl zurückgegeben, mit der
die Anzahl der tatsächlich gelesenen Bytes angezeigt wird. Andernfalls
wird -1 zurückgegeben, errno zur Anzeige des Fehlers gesetzt, und der
Inhalt des Puffers, auf den buf zeigt, ist unbestimmt.
Achtung: Änderung durch ISO POSIX-1-Standard:
Falls read() durch ein Signal unterbrochen wird, nachdem erfolgreich
Daten gelesen wurden, wird die Anzahl der tatsächlich gelesenen Bytes
angezeigt. Bei einer Signalunterbrechung vor dem Lesen irgendwelcher
Daten wird -1 zurückgegeben und errno gesetzt.
SIEHE AUCH
creat(2), dup(2), fcntl(2), getmsg(2), ioctl(2), open(2), pipe(2),
unistd(4), lfs(5), types(5), uio(5), streamio(7), termio(7).
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98