| read(2) | System Calls Manual | read(2) |
read - citește dintr-un descriptor de fișier
Biblioteca C standard (libc, -lc)
#include <unistd.h>
ssize_t read(int fd, void buf[.count], size_t count);
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.
Î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ă.
Pot apărea și alte erori, în funcție de obiectul conectat la fd.
POSIX.1-2008.
SVr4, 4.3BSD, POSIX.1-2001.
Î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.
Î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”):
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.
close(2), fcntl(2), ioctl(2), lseek(2), open(2), pread(2), readdir(2), readlink(2), readv(2), select(2), write(2), fread(3)
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 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.
| 2 mai 2024 | Pagini de manual de Linux 6.9.1 |