read(2) System Calls Manual read(2) NUME read - citete dintr-un descriptor de fiier BIBLIOTECA Biblioteca C standard (libc, -lc) REZUMAT #include ssize_t read(int fd, void buf[.count], size_t count); DESCRIERE read() incearca sa citeasca pana la count octei din descriptorul de fiier fd in memoria tampon care incepe la buf. In cazul fiierelor care accepta cautarea, operaia de citire incepe de la poziia fiierului, iar poziia fiierului este incrementata cu numarul de octei citii. In cazul in care poziia fiierului se afla la sau dupa sfaritul fiierului, nu se citete niciun octet, iar read() returneaza zero. Daca count este zero, read() poate detecta erorile descrise mai jos. In absena oricaror erori sau daca read() nu verifica daca exista erori, o citire read() cu count de 0 returneaza zero i nu are alte efecte. In conformitate cu POSIX.1, daca count este mai mare decat SSIZE_MAX, rezultatul este definit de implementare; a se vedea NOTE pentru limita superioara in Linux. VALOAREA RETURNATA In caz de succes, se returneaza numarul de octei citii (zero indica sfaritul fiierului), iar poziia fiierului este avansata cu acest numar. Nu este o eroare daca acest numar este mai mic decat numarul de octei cerut; acest lucru se poate intampla, de exemplu, pentru ca sunt disponibili mai puini octei in acest moment (poate pentru ca am fost aproape de sfaritul fiierului, pentru ca citim dintr-o conducta sau de la un terminal) sau pentru ca read() a fost intrerupt de un semnal. A se vedea, de asemenea, seciunea NOTE. In caz de eroare, se returneaza -1, iar errno este configurata pentru a indica eroarea. In acest caz, nu se specifica daca poziia fiierului (daca exista) se modifica. ERORI-IEIRE EAGAIN Descriptorul de fiier fd se refera la un fiier, altul decat un soclu, i a fost marcat ca neblocat (O_NONBLOCK), iar citirea ar trebui sa fie blocata. A se vedea open(2) pentru mai multe detalii privind marcajul O_NONBLOCK. EAGAIN sau EWOULDBLOCK Descriptorul de fiier fd se refera la un soclu i a fost marcat ca fiind neblocat (O_NONBLOCK), iar citirea ar trebui sa fie blocata. POSIX.1-2001 permite returnarea oricarei erori in acest caz i nu impune ca aceste constante sa aiba aceeai valoare, astfel incat o aplicaie portabila ar trebui sa verifice ambele posibilitai. EBADF fd nu este un descriptor de fiier valid sau nu este deschis pentru citire. EFAULT memoria-tampon se afla in afara spaiului dvs. de adrese accesibil. EINTR Apelul a fost intrerupt de un semnal inainte ca datele sa fie citite; a se vedea signal(7). EINVAL fd este ataat la un obiect care nu este adecvat pentru citire; sau fiierul a fost deschis cu fanionul O_DIRECT i fie adresa specificata in buf, fie valoarea specificata in count, fie decalajul fiierului nu este aliniat corespunzator. EINVAL fd a fost creat printr-un apel la timerfd_create(2) i o dimensiune greita a memoriei tampon a fost furnizata lui read(); a se vedea timerfd_create(2) pentru informaii suplimentare. EIO Eroare de In/Ie. Acest lucru se va intampla, de exemplu, atunci cand procesul se afla intr-un grup de procese in fundal, incearca sa citeasca de la terminalul sau de control i fie ignora sau blocheaza SIGTTIN, fie grupul sau de procese este orfan. Poate aparea, de asemenea, atunci cand exista o eroare de intrare/ieire de nivel scazut in timpul citirii de pe un disc sau de pe o banda. O alta cauza posibila a apariiei EIO pe sistemele de fiiere in reea este atunci cand a fost luat un blocaj consultativ pe descriptorul de fiier i aceasta blocare a fost pierduta. Consultai seciunea Locuri pierdute din fcntl(2) pentru mai multe detalii. EISDIR fd se refera la un director. Pot aparea i alte erori, in funcie de obiectul conectat la fd. STANDARDE POSIX.1-2008. ISTORIC SVr4, 4.3BSD, POSIX.1-2001. NOTE In Linux, read() (i apelurile de sistem similare) va transfera cel mult 0x7ffff000 (2.147.479.552) octei, returnand numarul de octei transferai efectiv; (acest lucru este valabil atat pe sistemele pe 32 de bii, cat i pe cele pe 64 de bii). In cazul sistemelor de fiiere NFS, citirea unor cantitai mici de date va actualiza marca temporala numai prima data, iar apelurile ulterioare pot sa nu faca acest lucru. Acest lucru este cauzat de memoria cache a atributelor din partea clientului, deoarece majoritatea, daca nu chiar toi clienii NFS lasa actualizarile st_atime (ultima ora de acces la fiier) la server, iar citirile din partea clientului satisfacute din memoria cache a clientului nu vor cauza actualizari st_atime pe server, deoarece nu exista citiri pe partea serverului. Semantica UNIX poate fi obinuta prin dezactivarea memorarii in cache a atributelor pe partea clientului, dar in majoritatea situaiilor acest lucru va crete substanial sarcina serverului i va scadea performana. ERORI In conformitate cu POSIX.1-2008/SUSv4 seciunea XSI 2.9.7 (,,Interaciuni ale firelor de execuie cu operaiile fiierelor obinuite"): Toate funciile urmatoare trebuie sa fie atomice una faa de cealalta in efectele specificate in POSIX.1-2008 atunci cand opereaza cu fiiere obinuite sau legaturi simbolice: ... Printre API-urile enumerate ulterior se numara read() i readv(2). Iar printre efectele care ar trebui sa fie atomice intre fire de execuie (i procese) se numara actualizarile poziiei fiierului. Cu toate acestea, inainte de Linux 3.14, acest lucru nu era valabil: daca doua procese care impart o descriere de fiier deschis (a se vedea open(2)) efectuau un read() (sau readv(2)) in acelai timp, atunci operaiile de In/Ie nu erau atomice in ceea ce privete actualizarea poziiei fiierului, cu rezultatul ca citirile din cele doua procese se puteau suprapune (in mod incorect) in blocurile de date pe care le obineau. Aceasta problema a fost rezolvata in Linux 3.14. CONSULTAI 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 in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.06 31 octombrie 2023 read(2)