read(2) System Calls Manual read(2) BEZEICHNUNG read - aus einem Dateideskriptor lesen BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include ssize_t read(int dd, void Puffer[.Anzahl], size_t Anzahl); BESCHREIBUNG read() versucht, bis zu Anzahl Byte aus dem Dateideskriptor dd in den bei Puffer beginnenden Puffer zu lesen. Bei Dateien, die das Durchsuchen unterstutzen, beginnt der Lesevorgang am Offset der Datei, wobei der Datei-Offset durch die Anzahl der gelesenen Bytes erhoht wird. Falls der Datei-Offset am Ende oder hinter dem Ende der Datei liegt, werden keine Bytes gelesen und read() gibt Null zuruck. Falls Anzahl Null ist, kann read() eventuell die nachfolgend beschriebenen Fehler erkennen. Ohne jegliche Fehlermeldungen, oder wenn read() nicht auf Fehler pruft, gibt ein Aufruf von read() und wenn Anzahl 0 ist, Null zuruck und hat keine weiteren Auswirkungen. Laut POSIX.1 hangt das Ergebnis von der Implementierung ab, falls Anzahl grosser als SSIZE_MAX ist; siehe ANMERKUNGEN fur die Obergrenze unter Linux. RUCKGABEWERT Bei Erfolg wird die Anzahl der gelesenen Bytes zuruckgegeben (null bedeutet Dateiende) und die Position in der Datei wird um diese Anzahl erhoht. Es ist kein Fehler, wenn diese Zahl kleiner ist als die Zahl der angeforderten Bytes; das kann geschehen, wenn gerade wirklich weniger Bytes verfugbar sind (vielleicht ist das Dateiende nah oder es wird aus einer Pipe oder von einem Terminal gelesen) oder weil read() durch ein Signal unterbrochen wurde. Siehe auch ANMERKUNGEN. Im Fehlerfall wird -1 zuruckgegeben und errno wird gesetzt, um den Fehler anzuzeigen. In diesem Fall ist nicht festgelegt, ob die Position in der Datei (wenn es uberhaupt eine gibt) geandert wird. FEHLER EAGAIN Der Dateideskriptor dd bezieht sich auf eine Datei, die kein Socket ist, und wurde als nicht blockierend (O_NONBLOCK) markiert und das Lesen wurde blockieren. Siehe open(2) fur weitere Details uber den Schalter O_NONBLOCK. EAGAIN oder EWOULDBLOCK Der Dateideskriptor dd bezieht sich auf ein Socket und wurde als nicht blockierend (O_NONBLOCK) markiert und das Lesen wurde blockieren. POSIX.1-2001 erlaubt in diesem Fall, dass eine der beiden Fehlermeldungen zuruckgeliefert wird und verlangt nicht, dass beide Konstanten den gleichen Wert haben. Daher sollten portable Anwendungen auf beide Moglichkeiten prufen. EBADF dd ist kein gultiger Dateideskriptor oder ist nicht zum Lesen geoffnet. EFAULT Puffer liegt ausserhalb Ihres adressierbaren Adressraums. EINTR Der Aufruf wurde durch ein Signal unterbrochen, bevor Daten gelesen wurden; siehe signal(7). EINVAL dd ist einem Objekt zugeordnet, aus dem nicht gelesen werden kann; oder die Datei wurde mit dem Schalter O_DIRECT geoffnet und entweder die in Puffer angegebene Adresse, der in Anzahl angegebene Wert oder der Datei-Offset ist nicht entsprechend ausgerichtet. EINVAL dd wurde uber einen Aufruf von timerfd_create(2) erstellt und der falsche Grossenpuffer wurde an read() ubergeben; siehe timerfd_create(2) fur weitere Informationen. EIO E/A-Fehler. Dies wird zum Beispiel passieren, wenn der Prozess zu einer Hintergrund-Prozessgruppe gehort und versucht, von seinem steuernden Terminal zu lesen und er entweder SIGTTIN ignoriert oder sperrt oder seine Prozessgruppe verwaist ist. Es kann auch durch einen Low-Level-E/A-Fehler wahrend des Lesens von einer Platte oder einem Band gesetzt werden. Ein weitere mogliche Ursache von EIO bei Netzwerkdateisystemen sind empfohlene Sperren, die aus dem Dateideskriptor herausgenommen wurden, und diese Sperre dann verloren gegangen ist. Siehe den Abschnitt Verlorene Sperren von fcntl(2) fur weitere Details. EISDIR dd referenziert ein Verzeichnis. Abhangig von dem mit dd verbundenen Objekt konnen andere Fehler auftreten. STANDARDS POSIX.1-2008. GESCHICHTE SVr4, 4.3BSD, POSIX.1-2001. ANMERKUNGEN Unter Linux wird read() (und ahnliche Systemaufrufe) hochstens 0x7ffff000 (2.147.479.552) Byte ubertragen und die Anzahl der tatsachlich ubertragenen Bytes zuruckliefern. Dies trifft sowohl auf 32- als auch auf 64-Bit-Systemen zu. Auf NFS-Dateisystemen aktualisiert das Lesen kleiner Datenmengen den Zeitstempel nur beim ersten Mal, nachfolgende Anrufe konnen das nicht tun. Dies wird durch das clientseitige >>attribute caching<< (Zwischenspeichern der Attribute) verursacht, weil die meisten, wenn nicht alle NFS-Clients die Aktualisierung von st_atime (die letzte Zugriffszeit) dem Server uberlassen und Leseaktionen auf Clientseite, die aus seinem Cache bedient werden, st_atime nicht aktualisieren, weil nicht vom Server gelesen wird. UNIX-Semantik kann durch Deaktivieren des clientseitigen attribute cachings erhalten werden, aber in den meisten Fallen wird dadurch die Serverlast deutlich erhoht und die Leistung verringert. FEHLER Laut POSIX.1-2008/SUSv4 Abschnitt XSI 2.9.7 (>>Thread Interactions with Regular File Operations<<): Alle der folgenden Funktionen mussen im Hinblick aufeinander atomar bezuglich der in POSIX.1-2008 angegebenen Effekte sein, wenn sie auf regularen Dateien oder symbolischen Links arbeiten: Unter den im Folgenden aufgefuhrten APIs sind read() und readv(2). Und unter den Effekten, die uber Threads (und Prozesse) hinweg atomar sein sollten, ist die Aktualisierung des Dateiversatzes. Unter Linux vor Version 3.14 war das allerdings nicht der Fall: Falls zwei Prozesse, die eine offene Dateideskription gemeinsam nutzten (siehe open(2)) gleichzeitig einen read() (oder readv(2)) durchfuhrten, waren die E/A-Aktionen im Hinblick auf die Aktualisierung des Dateiversatzes nicht atomar. Das Ergebnis war, dass beim Lesen erhaltene Datenblocken in den zwei Prozessen sich (inkorrekterweise) uberlappten. Dieses Problem wurde in Linux 3.14 behoben. SIEHE AUCH close(2), fcntl(2), ioctl(2), lseek(2), open(2), pread(2), readdir(2), readlink(2), readv(2), select(2), write(2), fread(3) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Michael Haardt , Martin Eberhard Schauer , Mario Blattermann und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 read(2)