read(2)

NAAM
read - lees van een bestandbeschrijving

BIBLIOTHEEK
Standaard C bibliotheek (libc, -lc)

SAMENVATTING
#include <unistd.h>

ssize_t read(size_t count;
             int fd, void buf[count], size_t count);

BESCHRIJVING
read() probeert tot aan tel bytes van bestandsbeschrijving bes_ind in te lezen naar de buffer buf.

In bestanden die zoeken ondersteunen begint de lees-operatie bij de bestandspositie, en wordt de bestandspositie verhoogd met het aantal gelezen bytes. Als de bestandspositie op of voorbij het einde van het bestand staat, dan worden geen bytes gelezen en geeft read() nul terug.

Als tel nul is, kan read() fouten zoals hieronder beschreven detecteren. In afwezigheid van enige fout, of als read() niet op fouten controleert, zal een read() met een tel gelijk 0 een 0 teruggeven en heeft verder geen andere effecten.

Volgens POSIX.1 als tel groter is dan SSIZE_MAX dan is het resultaat implementatie afhankelijk; zie OPMERKINGEN voor de boven grens op Linux.

EIND WAARDE
Bij success wordt het aantal gelezen bytes teruggegeven (nul betekend einde van het bestand); de positie in het bestand wordt met dit aantal vooruitgezet. Het is niet fout als dat aantal kleiner is dan het gevraagde aantal bytes, dat kan bijvoorbeeld gebeuren als er minder bytes voorhanden zijn op dat ogenblik (wellicht omdat we dicht bij eind-van-bestand zijn, omdat we van een pijp lezen, of van een terminal, of omdat read() onderbroken werd door een signaal). Zie ook OPMERKINGEN.

Bij falen wordt -1 teruggegeven, en errno wordt overeenkomstig gezet. In dit geval is niet bepaald of de plaats in het bestand (als die bestaat) veranderd.

FOUTEN

EAGAIN
    De bestandsbeschrijving bes_ind refereert naar een ander bestand dan de socket en is gemarkeerd als niet-blokkerend (O_NONBLOCK, en de read zou blokkeren. Zie open(2) voor meer details over de O_NONBLOCK vlag.

EAGAIN of EWOULDBLOCK
    De bestandsbeschrijving bes_ind refereert naar een socket en werd gemarkeerd als niet-blokkerend (O_NONBLOCK, en de read() zou blokkeren. POSIX.1-2001 staat toe in dit geval een fout te retourneren en vereist niet dat deze constanten dezelfde waarde hebben, waardoor een overdraagbare applicatie op beide mogelijkheden zou moeten controleren.

EBADF
    bes_ind is geen geldige bestandsbeschrijving, of is niet open voor lezen.

EFAULT
    buf ligt buiten de door u toegankelijke adres ruimte.

EINTR
    De aanroep werd onderbroken door een signaal voordat enige data werd gelezen; zie signal(7).

EINVAL
    bes_ind is gekoppeld aan een object dat ongeschikt is om van te lezen; of het bestand werd geopend met de O_DIRECT vlag en ofwel het adres opgegeven in buf, de waarde opgegeven tel of de bestandsplaats is niet goed uitgelijnd.

EINVAL
    bes_ind werd aangemaakt door een aanroep van timerfd_create(2) en de verkeerde buffer grootte werd meegegeven aan read(); zie timerfd_create(2) voor meer informatie.

EIO Invoer/Uitvoer fout. Dit gebeurd bijvoorbeeld als een proces uit een achtergrond-proces-groep probeert van zijn controlerende terminal te lezen en, ofwel het negeert/blokkeert SIGTTIN, ofwel zijn proces-groep is verweesd. Het kan ook optreden als er een laag-niveau Invoer/Uitvoer fout is terwijl er van schijf of tape gelezen wordt. Een andere mogelijke oorzaak van EIO op netwerk bestandssystemen is wanneer een geadviseerd lock werd verwijderd van de bestandsbeschrijving en dat die lock verloren raakte. Zie de Verloren locks sectie van fcntl(2) voor meer details.

EISDIR
    bes_ind wijst naar een map.

Andere fouten kunnen optreden afhankelijk van dat wat verbonden is met bi.

STANDAARDEN
POSIX.1-2008.

HISTORIE
SVr4, 4.3BSD, POSIX.1-2001.

OPMERKINGEN
Op Linux zal read() (en vergelijkbare systeem aanroepen) op zijn hoogst 0x7ffff000 (2,147,479,552) bytes overdragen, en het daadwerkelijk aantal overgedragen bytes retourneren. (Dit is waar op beide 32-bit en 64-bit systemen.)

Bij NFS bestandssystemen zal het lezen van kleine hoeveelheden gegevens de tijdstempel alleen de eerste keer veranderen, volgende aanroepen laten de tijdstempel onveranderd. Dit wordt veroorzaakt door bufferen van bestandskenmerken aan de zijde van de cliënt: de meeste -zo niet alle- NFS cliënten laten het bijwerken van de `atime' aan de server over; als een lees-opdracht dan genoeg heeft aan de cliënt-kant buffer vind er geen lees-opdracht plaats naar de server en blijft de atime dus onveranderd. UNIX gedrag kan verkregen worden door het bufferen aan de zijde van de cliënt uit te schakelen, maar dat zal in de meeste situaties de last op de server flink vergroten, en zijn prestaties nadelig beïnvloeden.

BUGS
Volgens POSIX.1-2008/SUSv4 Sectie XSI 2.9.7 ("Thread interacties met Reguliere Bestand Operaties"):

    Alle volgende functie zullen onderling atomair zijn voor wat betreft de effecten die in POSIX.1-2008 gespecificeerd zijn indien ze werken op reguliere bestanden of symbolische koppelingen: ...

Tussen de achtereenvolgens vermelde API´s staan read() en readv(2). En tussen de effecten die atomair zouden moeten zijn voor alle threads (en processen) zijn aanpassingen aan de bestandspositie. Echter vóór Linux versie 3.14 was dit niet het geval: als twee processen die een open bestandsindicator delen (zie open(2)) een read() (of readv(2)) op hetzelfde tijdstip uitvoeren, dan zijn de Invoer/Uitvoer operaties niet atomair met betrekking tot aanpassen van de bestandspositie, hetgeen erin resulteert dat de lees acties in beide processen (foutief) zou kunnen overlappen in de datablokken die ze zouden verkrijgen. Dit probleem werd opgelost in Linux 3.14.

ZIE OOK
close(2), fcntl(2), ioctl(2), lseek(2), open(2), pread(2), readdir(2), readlink(2), readv(2), select(2), write(2), fread(3)

VERTALING
De Nederlandse vertaling van deze handleiding is geschreven door Jos Boersema <joshb@xs4all.nl>, Mario Blättermann <mario.blaettermann@gmail.com> en Luc Castermans <luc.castermans@gmail.com>

Deze vertaling is vrije documentatie; lees de GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) of later over de Copyright-voorwaarden. Er is geen AANSPRAKELIJKHEID.

Indien U fouten in de vertaling van deze handleiding zou vinden, stuur een e-mail naar debian-l10n-dutch@lists.debian.org.