Definition | #include <sys/uio.h> ssize_t readv(int fildes, const struct iovec *iov, int iovcnt); |
Beschreibung | siehe read() . readv() verhält sich wie read() , liest jedoch die Eingabedaten aus der zu fildes gehörenden Datei in die iovcnt-Puffer, die als Elemente des Feldes iov spezifiziert sind: iov[0], iov[1], ..., iov[iovcnt-1]. Es muss gelten 0 < iovcnt ≤ {IOV_MAX}
Die Struktur iovec enthält folgende Elemente: addr_t iov_base;
size_t iov_len;
Jeder iovec -Eintrag gibt die Basisadresse und Länge eines Speicherbereichs (Puffer) an, in den Daten gebracht werden sollen. readv() füllt einen Puffer immer vollständig, bevor es mit dem nächsten weitermacht. Bei Erfolg gibt readv() die Anzahl der tatsächlich gelesenen und in den Puffer geschriebenen Bytes zurück. Bei Erreichen des Dateiendes wird 0 zurückgegeben. |
Returnwert | ganze Zahl >0 |
|
| bei Erfolg. Die Zahl gibt die Anzahl der tatsächlich gelesenen Bytes an. |
| 0 | wenn beim Lesen das Dateiende (EOF) erreicht wurde. |
| -1 | bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen. Der Inhalt der Puffer ist unbestimmt. |
Fehler | readv() schlägt fehl, wenn gilt:
|
| EAGAIN
| Das Flag O_NONBLOCK ist für den Dateideskriptor gesetzt und der Prozess würde durch die Leseoperation angehalten werden. |
| Erweiterung |
| EAGAIN
| Der Systemspeicher, der für „raw“-Ein-/Ausgabe zur Verfügung steht, ist vorübergehend nicht ausreichend, oder in einer Terminal-Gerätedatei warten keine Daten darauf, gelesen zu werden, und O_NONBLOCK ist gesetzt, oder in einen Datenstrom wartet keine Nachricht darauf, gelesen zu werden, und O_NONBLOCK ist gesetzt. (Ende) |
| EBADF
| fildes ist kein gültiger, zum Lesen geöffneter Dateideskriptor. |
| EBADMSG
| Die Datei ist eine STREAM-Datei im control-normal-mode, aber die Nachricht, die darauf wartet, gelesen zu werden, enthält einen Steuerteil. |
| EFAULT
| iov weist über den zugewiesenen Adressraum des Prozesses hinaus. |
| EINTR
| Die Leseoperation wurde durch ein Signal unterbrochen. Es wurden keine Daten übertragen. |
| EINVAL
| Es wurde versucht, von einem Datenstrom zu lesen, der mit einem Multiplexer verbunden ist oder die Summe der iov-len-Werte im Feld iov bewirkte einen ssize_t -Überlauf oder iovcnt <= 0 oder iovcnt > 16. |
| EIO
| Ein physikalischer Ein-/Ausgabefehler ist aufgetreten, oder der Prozess ist Mitglied einer Hintergrund-Prozessgruppe und versucht, von seinem steuernden Terminal zu lesen. Der Prozess ignoriert oder blockiert das Signal SIGTTIN , oder die Prozessgruppe ist verwaist. |
| ENXIO
| Eine Anforderung für ein nicht existierendes Gerät wurde gemacht, oder die Anforderung lag außerhalb der Fähigkeiten des Geräts. |
| ENOLINK
| fildes liegt auf einem fernen Rechner, und die Verbindung zu diesem Rechner ist nicht mehr aktiv. |
| Ein readv() 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 readv() normal weiter, bis die Lesewarteschlange des Stream-Kopfes entleert ist. Danach wird 0 zurückgegeben. |
Hinweis | Zum Lesen von Verzeichnissen wird dringend empfohlen, readdir() bzw. readdir64() anstelle von read() zu verwenden. |
Siehe auch | fcntl() , ioctl() , lseek() , open() , pipe() , readdir() , readdir64() , stropts.h , sys/uio.h , unistd.h .
|