read(2)

NUME
read - citește dintr-un descriptor de fișier

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <unistd.h>

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

DESCRIERE
read() încearcă să citească până la count octeți din descriptorul de fișier fd în memoria tampon care începe la buf.

În cazul fișierelor care acceptă căutarea, operația de citire începe de la poziția fișierului, iar poziția fișierului este incrementată cu numărul de octeți citiți. În cazul în care poziția fișierului se află la sau după sfârșitul fișierului, nu se citește niciun octet, iar read() returnează zero.

Dacă count este zero, read() poate detecta erorile descrise mai jos. În absența oricăror erori sau dacă read() nu verifică dacă există erori, o citire read() cu count de 0 returnează zero și nu are alte efecte.

În conformitate cu POSIX.1, dacă count este mai mare decât SSIZE_MAX, rezultatul este definit de implementare; a se vedea NOTE pentru limita superioară în Linux.

VALOAREA RETURNATĂ
În caz de succes, se returnează numărul de octeți citiți (zero indică sfârșitul fișierului), iar poziția fișierului este avansată cu acest număr. Nu este o eroare dacă acest număr este mai mic decât numărul de octeți cerut; acest lucru se poate întâmpla, de exemplu, pentru că sunt disponibili mai puțini octeți în acest moment (poate pentru că am fost aproape de sfârșitul fișierului, pentru că citim dintr-o conductă sau de la un terminal) sau pentru că read() a fost întrerupt de un semnal. A se vedea, de asemenea, secțiunea NOTE.

În caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea. În acest caz, nu se specifică dacă poziția fișierului (dacă există) se modifică.

ERORI-IEȘIRE

EAGAIN
    Descriptorul de fișier fd se referă la un fișier, altul decât un soclu, și a fost marcat ca neblocat (O_NONBLOCK), iar citirea ar trebui să fie blocată. A se vedea open(2) pentru mai multe detalii privind marcajul O_NONBLOCK.

EAGAIN sau EWOULDBLOCK
    Descriptorul de fișier fd se referă la un soclu și a fost marcat ca fiind neblocat (O_NONBLOCK), iar citirea ar trebui să fie blocată. POSIX.1-2001 permite returnarea oricărei erori în acest caz și nu impune ca aceste constante să aibă aceeași valoare, astfel încât o aplicație portabilă ar trebui să verifice ambele posibilități.

EBADF
    fd nu este un descriptor de fișier valid sau nu este deschis pentru citire.

EFAULT
    buf se află în afara spațiului dvs. de adrese accesibil.

EINTR
    Apelul a fost întrerupt de un semnal înainte ca datele să fie citite; a se vedea signal(7).

EINVAL
    fd este atașat la un obiect care nu este adecvat pentru citire; sau fișierul a fost deschis cu fanionul O_DIRECT și fie adresa specificată în buf, fie valoarea specificată în count, fie decalajul fișierului nu este aliniat corespunzător.

EINVAL
    fd a fost creat printr-un apel la timerfd_create(2) și o dimensiune greșită a memoriei tampon a fost furnizată lui read(); a se vedea timerfd_create(2) pentru informații suplimentare.

EIO Eroare de In/Ieș. Acest lucru se va întâmpla, de exemplu, atunci când procesul se află într-un grup de procese în fundal, încearcă să citească de la terminalul său de control și fie ignoră sau blochează SIGTTIN, fie grupul său de procese este orfan. Poate apărea, de asemenea, atunci când există o eroare de intrare/ieșire de nivel scăzut în timpul citirii de pe un disc sau de pe o bandă. O altă cauză posibilă a apariției EIO pe sistemele de fișiere în rețea este atunci când a fost luat un blocaj consultativ pe descriptorul de fișier și această blocare a fost pierdută. Consultați secțiunea Locuri pierdute din fcntl(2) pentru mai multe detalii.

EISDIR
    fd se referă la un director.

Pot apărea și alte erori, în funcție de obiectul conectat la fd.

STANDARDE
POSIX.1-2008.

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

NOTE
În Linux, read() (și apelurile de sistem similare) va transfera cel mult 0x7ffff000 (2.147.479.552) octeți, returnând numărul de octeți transferați efectiv; (acest lucru este valabil atât pe sistemele pe 32 de biți, cât și pe cele pe 64 de biți).

În cazul sistemelor de fișiere NFS, citirea unor cantități mici de date va actualiza marca temporală numai prima dată, iar apelurile ulterioare pot să nu facă acest lucru. Acest lucru este cauzat de memoria cache a atributelor din partea clientului, deoarece majoritatea, dacă nu chiar toți clienții NFS lasă actualizările st_atime (ultima oră de acces la fișier) la server, iar citirile din partea clientului satisfăcute din memoria cache a clientului nu vor cauza actualizări st_atime pe server, deoarece nu există citiri pe partea serverului. Semantica UNIX poate fi obținută prin dezactivarea memorării în cache a atributelor pe partea clientului, dar în majoritatea situațiilor acest lucru va crește substanțial sarcina serverului și va scădea performanța.

ERORI
În conformitate cu POSIX.1-2008/SUSv4 secțiunea XSI 2.9.7 („Interacțiuni ale firelor de execuție cu operațiile fișierelor obișnuite”):

    Toate funcțiile următoare trebuie să fie atomice una față de cealaltă în efectele specificate în POSIX.1-2008 atunci când operează cu fișiere obișnuite sau legături simbolice: ...

Printre API-urile enumerate ulterior se numără read() și readv(2). Iar printre efectele care ar trebui să fie atomice între fire de execuție (și procese) se numără actualizările poziției fișierului. Cu toate acestea, înainte de Linux 3.14, acest lucru nu era valabil: dacă două procese care împart o descriere de fișier deschis (a se vedea open(2)) efectuau un read() (sau readv(2)) în același timp, atunci operațiile de In/Ieș nu erau atomice în ceea ce privește actualizarea poziției fișierului, cu rezultatul că citirile din cele două procese se puteau suprapune (în mod incorect) în blocurile de date pe care le obțineau. Această problemă a fost rezolvată în Linux 3.14.

CONSULTAȚI ȘI
close(2), fcntl(2), ioctl(2), lseek(2), open(2), pread(2), readdir(2), readlink(2), readv(2), select(2), write(2), fread(3)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.