sendfile(2)

NUME
sendfile - transferă date între descriptori de fișiere

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <sys/sendfile.h>

ssize_t sendfile(int out_fd, int in_fd, off_t *_Nullable offset,
                 size_t count);

DESCRIERE
sendfile() copiază date între un descriptor de fișier și altul. Deoarece această copiere se face în interiorul nucleului, sendfile() este mai eficient decât combinația dintre read(2) și write(2), care ar necesita transferul de date către și din spațiul utilizatorului.

in_fd trebuie să fie un descriptor de fișier deschis pentru citire, iar out_fd trebuie să fie un descriptor deschis pentru scriere.

Dacă offset nu este NULL, atunci indică o variabilă care conține poziția fișierului de la care sendfile() va începe să citească datele din in_fd. La returnarea lui sendfile(), această variabilă va fi stabilită la poziția octetului care urmează ultimului octet citit. Dacă offset nu este NULL, atunci sendfile() nu modifică poziția în fișier a lui in_fd; în caz contrar, poziția în fișier este ajustată pentru a reflecta numărul de octeți citiți din in_fd.

Dacă offset este NULL, atunci datele vor fi citite din in_fd începând de la poziția fișierului, iar poziția fișierului va fi actualizată de apel.

count este numărul de octeți care trebuie copiați între descriptorii de fișiere.

Argumentul in_fd trebuie să corespundă unui fișier care acceptă operații de tip mmap(2) (adică nu poate fi un soclu). Mai puțin începând cu Linux 5.12 și dacă out_fd este o conductă, caz în care sendfile() se transformă în splice(2) și se aplică restricțiile sale.

Înainte de Linux 2.6.33, out_fd trebuie să se refere la un soclu. Începând cu Linux 2.6.33, poate fi vorba de orice fișier. Dacă acesta este explorabil, atunci sendfile() modifică în mod corespunzător poziția fișierului.

VALOAREA RETURNATĂ
În cazul în care transferul a avut succes, se returnează numărul de octeți scriși în out_fd. Rețineți că un apel reușit la sendfile() poate scrie mai puțini octeți decât cei solicitați; apelantul trebuie să fie pregătit să reia apelul în cazul în care există octeți care nu au fost trimiși. A se vedea, de asemenea, secțiunea NOTE.

În caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

EAGAIN
    Ieșirea/ieșirea fără blocare a fost selectată folosind O_NONBLOCK și scrierea s-ar bloca.

EBADF
    Fișierul de intrare nu a fost deschis pentru citire sau fișierul de ieșire nu a fost deschis pentru scriere.

EFAULT
    Adresă incorectă.

EINVAL
    Descriptorul nu este valid sau blocat, sau o operație de tip mmap(2) nu este disponibilă pentru in_fd, sau count este negativ.

EINVAL
    out_fd are activat fanionul O_APPEND. În prezent, acest lucru nu este acceptat de sendfile().

EIO Eroare nespecificată în timpul citirii din in_fd.

ENOMEM
    Memorie insuficientă pentru a citi din in_fd.

EOVERFLOW
    count este prea mare, operația ar duce la depășirea dimensiunii maxime a fișierului de intrare sau a fișierului de ieșire.

ESPIPE
    offset nu este NULL, dar fișierul de intrare nu poate fi explorat.

VERSIUNI
Alte sisteme UNIX implementează sendfile() cu o semantică și prototipuri diferite. Acesta nu ar trebui să fie utilizat în programele portabile.

STANDARDE
Niciunul.

ISTORIC
Linux 2.2, glibc 2.1.

În Linux 2.4 și versiunile anterioare, out_fd se putea referi, de asemenea, la un fișier obișnuit; această posibilitate a dispărut în seria de nuclee Linux 2.6.x, dar a fost restabilită în Linux 2.6.33.

Apelul de sistem original Linux sendfile() nu a fost conceput pentru a gestiona poziții din fișiere mari. În consecință, Linux 2.4 a adăugat sendfile64(), cu un tip mai larg pentru argumentul offset. Funcția de învăluire glibc sendfile() se ocupă în mod transparent de diferențele din nucleu.

NOTE
sendfile() 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).

Dacă intenționați să utilizați sendfile() pentru a trimite fișiere către un soclu TCP, dar trebuie să trimiteți unele date de antet înainte de conținutul fișierului, veți găsi utilă utilizarea opțiunii TCP_CORK, descrisă în tcp(7), pentru a minimiza numărul de pachete și pentru a regla performanța.

Este posibil ca aplicațiile să dorească să revină la read(2) și write(2) în cazul în care sendfile() eșuează cu EINVAL sau ENOSYS.

În cazul în care out_fd se referă la un soclu sau la o conductă cu suport de copiere zero, apelanții trebuie să se asigure că porțiunile transferate din fișierul la care face referire in_fd rămân nemodificate până când cititorul de la celălalt capăt al out_fd a consumat datele transferate.

Apelul splice(2), specific Linux, permite transferul de date între descriptori de fișiere arbitrari, cu condiția ca unul (sau amândoi) dintre ei să fie o conductă.

CONSULTAȚI ȘI
copy_file_range(2), mmap(2), open(2), socket(2), splice(2)

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.