write(2) System Calls Manual write(2) NUME write - scrie intr-un descriptor de fiier BIBLIOTECA Biblioteca C standard (libc, -lc) SINOPSIS #include ssize_t write(int fd, const void buf[.count], size_t count); DESCRIERE write() scrie pana la count octei din memoria tampon care incepe la buf in fiierul la care se face referire prin descriptorul de fiier fd. Numarul de octei scrii poate fi mai mic decat count daca, de exemplu, nu exista spaiu suficient pe suportul fizic subiacent, daca este intalnita limita de resurse RLIMIT_FSIZE (a se vedea setrlimit(2)) sau daca apelul a fost intrerupt de un gestionar de semnal dupa ce a scris mai puin de count octei. A se vedea i pipe(7). Pentru un fiier care poate fi cautat (adica unul caruia i se poate aplica lseek(2), de exemplu, un fiier obinuit), scrierea are loc la poziia fiierului, iar poziia fiierului este incrementata cu numarul de octei scrii efectiv. In cazul in care fiierul a fost deschis cu open(2) O_APPEND, poziia fiierului este mai intai stabilita la sfaritul fiierului inainte de scriere. Ajustarea decalajului fiierului i operaia de scriere sunt efectuate ca un pas atomic. POSIX stipuleaza ca un read(2) despre care se poate dovedi ca apare dupa ce un write() a fost returnat va returna noile date. Reinei ca nu toate sistemele de fiiere sunt conforme cu POSIX. 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, este returnat numarul de octei scrii. In caz de eroare, este returnat -1, iar errno este configurata pentru a indica eroarea. Reinei ca o operaie write() reuita poate transfera mai puin de count octei. Astfel de scrieri pariale pot avea loc din diverse motive; de exemplu, pentru ca nu a existat spaiu suficient pe dispozitivul de disc pentru a scrie toi octeii solicitai sau pentru ca un apel write() blocat catre un soclu, conducta sau similar a fost intrerupt de un gestionar de semnal dupa ce a transferat o parte, dar inainte de a transfera toi octeii solicitai. In cazul unei scrierii pariale, apelantul poate efectua un alt apel write() pentru a transfera octeii ramai. Apelul ulterior fie va transfera ali octei, fie poate duce la o eroare (de exemplu, daca discul este acum plin). Daca count este zero i fd se refera la un fiier obinuit, atunci write() poate returna o stare de eec daca este detectata una dintre erorile de mai jos. Daca nu sunt detectate erori sau daca detectarea erorilor nu este efectuata, se returneaza 0 fara a provoca alte efecte. Daca count este zero i fd se refera la un alt fiier decat un fiier obinuit, rezultatele nu sunt specificate. ERORI-IEIRE EAGAIN Descriptorul de fiier fd se refera la un alt fiier decat un soclu i a fost marcat ca fiind fara blocare (O_NONBLOCK), iar scrierea s-ar bloca. Consultai 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 fara blocare (O_NONBLOCK), iar scrierea s-ar bloca. POSIX.1-2001 permite returnarea oricarei erori in acest caz i nu solicita 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 scriere. EDESTADDRREQ fd se refera la o priza de datagrama pentru care nu a fost definita o adresa de maina partener folosind connect(2). EDQUOT Cota utilizatorului de blocuri de disc pe sistemul de fiiere care conine fiierul menionat de fd a fost epuizata. EFAULT buf se afla in afara spaiului dvs. de adrese accesibil. EFBIG S-a incercat scrierea unui fiier care depaete dimensiunea maxima a fiierului definita de implementare sau limita de dimensiune a fiierului procesului sau scrierea la o poziie care depaete decalajul maxim permis. EINTR Apelul a fost intrerupt de un semnal inainte ca orice date sa fie scrise; a se vedea signal(7). EINVAL fd este ataat unui obiect care nu este adecvat pentru scriere; sau fiierul a fost deschis cu fanionul O_DIRECT, iar adresa specificata in buf, valoarea specificata in count sau poziia fiierului nu este aliniata corespunzator. EIO S-a produs o eroare I/O de nivel scazut in timpul modificarii nodului-i. Aceasta eroare poate fi legata de scrierea inapoi (write-back) a datelor scrise de o operaie write() anterioara, care poate sa fi fost emisa catre un descriptor de fiier diferit pe acelai fiier. Incepand cu Linux 4.13, erorile de la write-back vin cu promisiunea ca acestea pot fi raportate de urmatoarele. write(), i will sa fie raportate de o cerere ulterioara fsync(2) (indiferent daca au fost sau nu raportate i de write()). O alta cauza a EIO pe sistemele de fiiere in reea este atunci cand un blocaj consultativ a fost luat pe descriptorul de fiier i acest blocaj a fost pierdut. Consultai seciunea Blocari pierdute din fcntl(2) pentru detalii suplimentare. ENOSPC Dispozitivul care conine fiierul la care se face referire prin fd nu are spaiu pentru date. EPERM Operaia a fost impiedicata de o sigilare de fiier; a se vedea fcntl(2). EPIPE fd este conectat la o conducta sau un soclu al carui capat de citire este inchis. Atunci cand acest lucru se intampla, procesul de scriere va primi i un semnal SIGPIPE; (astfel, valoarea de returnare a scrierii este vazuta numai daca programul capteaza, blocheaza sau ignora acest semnal). Pot aparea i alte erori, in funcie de obiectul conectat la fd. STANDARDE POSIX.1-2008. ISTORIC SVr4, 4.3BSD, POSIX.1-2001. Sub SVr4, o scriere poate fi intrerupta i se poate returna EINTR in orice moment, nu doar inainte ca datele sa fie scrise. NOTE O returnare cu succes de la write() nu garanteaza in niciun fel ca datele au fost stocate pe disc. Pe unele sisteme de fiiere, inclusiv NFS, nu garanteaza nici macar ca spaiul a fost rezervat cu succes pentru date. In acest caz, unele erori pot fi amanate pana la o viitoare operaie write(), fsync(2) sau chiar close(2). Singura modalitate de a fi siguri este sa apelai fsync(2) dupa ce ai terminat de scris toate datele. Daca o operaie write() este intrerupta de un gestionar de semnal inainte de scrierea oricarui octet, apelul eueaza cu eroarea EINTR; daca este intrerupt dupa scrierea a cel puin un octet, apelul reuete i returneaza numarul de octei scrii. Pe Linux, write() (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). O valoare returnata de eroare in timpul executarii write() folosind I/O direct nu inseamna ca intreaga scriere a euat. Se pot scrie date pariale, iar datele de la poziia fiierului pe care s-a incercat write() trebuie considerate inconsistente. 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 sunt write() i writev(2). Iar printre efectele care ar trebui sa fie atomice intre fire (i procese) se numara actualizarile poziiei fiierului. Cu toate acestea, inainte de Linux 3.14, acest lucru nu se intampla: daca doua procese care impart o descriere de fiier deschis (a se vedea open(2)) efectueaza o operaie write() (sau writev(2)) in acelai timp, atunci operaiile I/O nu erau atomice in ceea ce privete actualizarea poziiei fiierului, avand ca rezultat suprapunerea (incorecta) a blocurilor de date emise de cele doua procese. Aceasta problema a fost rezolvata in Linux 3.14. CONSULTAI I close(2), fcntl(2), fsync(2), ioctl(2), lseek(2), open(2), pwrite(2), read(2), select(2), writev(2), fwrite(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.9.1 2 mai 2024 write(2)