sendfile(2) System Calls Manual sendfile(2) NUME sendfile - transfera date intre descriptori de fiiere BIBLIOTECA Biblioteca C standard (libc, -lc) REZUMAT #include ssize_t sendfile(int out_fd, int in_fd, off_t *_Nullable offset, size_t count); DESCRIERE sendfile() copiaza date intre un descriptor de fiier i altul. Deoarece aceasta copiere se face in interiorul nucleului, sendfile() este mai eficient decat combinaia dintre read(2) i write(2), care ar necesita transferul de date catre i din spaiul utilizatorului. in_fd trebuie sa fie un descriptor de fiier deschis pentru citire, iar out_fd trebuie sa fie un descriptor deschis pentru scriere. Daca offset nu este NULL, atunci indica o variabila care conine poziia fiierului de la care sendfile() va incepe sa citeasca datele din in_fd. La returnarea lui sendfile(), aceasta variabila va fi stabilita la poziia octetului care urmeaza ultimului octet citit. Daca offset nu este NULL, atunci sendfile() nu modifica poziia in fiier a lui in_fd; in caz contrar, poziia in fiier este ajustata pentru a reflecta numarul de octei citii din in_fd. Daca offset este NULL, atunci datele vor fi citite din in_fd incepand de la poziia fiierului, iar poziia fiierului va fi actualizata de apel. count este numarul de octei care trebuie copiai intre descriptorii de fiiere. Argumentul in_fd trebuie sa corespunda unui fiier care accepta operaii de tip mmap(2) (adica nu poate fi un soclu). Mai puin incepand cu Linux 5.12 i daca out_fd este o conducta, caz in care sendfile() se transforma in splice(2) i se aplica restriciile sale. Inainte de Linux 2.6.33, out_fd trebuie sa se refere la un soclu. Incepand cu Linux 2.6.33, poate fi vorba de orice fiier. Daca acesta este explorabil, atunci sendfile() modifica in mod corespunzator poziia fiierului. VALOAREA RETURNATA In cazul in care transferul a avut succes, se returneaza numarul de octei scrii in out_fd. Reinei ca un apel reuit la sendfile() poate scrie mai puini octei decat cei solicitai; apelantul trebuie sa fie pregatit sa reia apelul in cazul in care exista octei care nu au fost trimii. A se vedea, de asemenea, seciunea NOTE. In caz de eroare, se returneaza -1, iar errno este configurata pentru a indica eroarea. ERORI-IEIRE EAGAIN Ieirea/ieirea fara blocare a fost selectata folosind O_NONBLOCK i scrierea s-ar bloca. EBADF Fiierul de intrare nu a fost deschis pentru citire sau fiierul de ieire nu a fost deschis pentru scriere. EFAULT Adresa incorecta. EINVAL Descriptorul nu este valid sau blocat, sau o operaie de tip mmap(2) nu este disponibila pentru in_fd, sau count este negativ. EINVAL out_fd are activat fanionul O_APPEND. In prezent, acest lucru nu este acceptat de sendfile(). EIO Eroare nespecificata in timpul citirii din in_fd. ENOMEM Memorie insuficienta pentru a citi din in_fd. EOVERFLOW count este prea mare, operaia ar duce la depairea dimensiunii maxime a fiierului de intrare sau a fiierului de ieire. ESPIPE offset nu este NULL, dar fiierul de intrare nu poate fi explorat. VERSIUNI Alte sisteme UNIX implementeaza sendfile() cu o semantica i prototipuri diferite. Acesta nu ar trebui sa fie utilizat in programele portabile. STANDARDE Niciunul. ISTORIC Linux 2.2, glibc 2.1. In Linux 2.4 i versiunile anterioare, out_fd se putea referi, de asemenea, la un fiier obinuit; aceasta posibilitate a disparut in seria de nuclee Linux 2.6.x, dar a fost restabilita in Linux 2.6.33. Apelul de sistem original Linux sendfile() nu a fost conceput pentru a gestiona poziii din fiiere mari. In consecina, Linux 2.4 a adaugat sendfile64(), cu un tip mai larg pentru argumentul offset. Funcia de invaluire glibc sendfile() se ocupa in mod transparent de diferenele din nucleu. NOTE sendfile() 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). Daca intenionai sa utilizai sendfile() pentru a trimite fiiere catre un soclu TCP, dar trebuie sa trimitei unele date de antet inainte de coninutul fiierului, vei gasi utila utilizarea opiunii TCP_CORK, descrisa in tcp(7), pentru a minimiza numarul de pachete i pentru a regla performana. Este posibil ca aplicaiile sa doreasca sa revina la read(2) i write(2) in cazul in care sendfile() eueaza cu EINVAL sau ENOSYS. In cazul in care out_fd se refera la un soclu sau la o conducta cu suport de copiere zero, apelanii trebuie sa se asigure ca poriunile transferate din fiierul la care face referire in_fd raman nemodificate pana cand cititorul de la celalalt capat al out_fd a consumat datele transferate. Apelul splice(2), specific Linux, permite transferul de date intre descriptori de fiiere arbitrari, cu condiia ca unul (sau amandoi) dintre ei sa fie o conducta. CONSULTAI I copy_file_range(2), mmap(2), open(2), socket(2), splice(2) 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 21 decembrie 2023 sendfile(2)