Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ read(2) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

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)

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

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