sendfile(2) System Calls Manual sendfile(2) NAZWA sendfile - przesyla dane pomiedzy deskryptorami plikow BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include ssize_t sendfile(int out_fd, int in_fd, off_t *_Nullable offset, size_t count); OPIS sendfile() kopiuje dane pomiedzy dwoma deskryptorami plikow. Kopiowanie odbywa sie wewnatrz jadra, dlatego sendfile() jest wydajniejsze niz polaczenie read(2) z write(2), ktore wymagaloby przeslania danych do i z przestrzeni uzytkownika. in_fd powinien byc deskryptorem pliku otwartym do odczytu, a out_fd powinien byc deskryptorem otwartym do zapisu. Jesli offset nie wynosi NULL, to wskazuje on na zmienna przechowujaca przesuniecie pliku, od ktorego sendfile() zacznie odczytywac dane z in_fd. Gdy sendfile() powroci, zmienna ta zostanie ustawiona na przesuniecie bajtu, ktory nastepuje po ostatnim odczytanym bajcie. Jesli offset nie wynosi NULL, to sendfile() nie modyfikuje przesuniecia pliku in_fd; w innym przypadku przesuniecie pliku jest dostosowywane, aby uwzglednic liczbe bajtow odczytanych z in_fd. Jesli offset wynosi NULL, to dane beda odczytane z in_fd, poczawszy od przesuniecia pliku, a przesuniecie pliku zostanie zaktualizowane przez to wywolanie. count jest liczba bajtow do skopiowania pomiedzy deskryptorami plikow. Argument in_fd musi odnosic sie do pliku obslugujacego operacje w stylu mmap(2) (tj. nie moze byc gniazdem). Od Linuksa 5.12 nie dotyczy to sytuacji, gdy out_fd jest potokiem; wowczas sendfile() upraszcza sie do splice(2) i stosuja sie jego ograniczenia. Przed Linuksem 2.6.33, out_fd musial odnosic sie do gniazda. Od Linuksa 2.6.33 moze byc to dowolny plik. Jesli jest przewijalny, to sendfile() odpowiednio dostosowuje przesuniecie pliku. WARTOSC ZWRACANA Jesli przeslanie sie powiodlo, zwracana jest liczba bajtow zapisanych do out_fd. Prosze zauwazyc, ze pomyslne wywolanie do sendfile() moze zapisac mniej bajtow niz zazadano; wywolujacy powinien byc przygotowany na ponowienie wywolania, jesli wystapily niewyslane bajty. Zob. tez UWAGI. W razie wystapienia bledu zwracane jest -1 i ustawiane errno wskazujac blad. BLEDY EAGAIN Wybrano nieblokujace wejscie/wyjscie za pomoca O_NONBLOCK, a zapis zablokowalby. EBADF Plik wejsciowy nie zostal otwarty do odczytu lub plik wyjsciowy nie zostal otwarty do zapisu. EFAULT Niepoprawny adres. EINVAL Deskryptor nie jest prawidlowy lub zablokowany; albo operacja w stylu mmap(2) nie jest dostepna dla in_fd; albo count jest ujemne. EINVAL out_fd ma ustawiony znacznik O_APPEND. Obecnie nie jest to obslugiwane przez sendfile(). EIO Nieokreslony blad przy odczycie z in_fd. ENOMEM Zabraklo pamieci do odczytu z in_fd. EOVERFLOW count jest zbyt duze, operacja spowodowalaby przekroczenie maksymalnego rozmiaru pliku wejsciowego lub pliku wyjsciowego. ESPIPE offset nie wynosi NULL, lecz plik wejsciowy nie jest przewijalny. WERSJE Inne systemy uniksowe implementuja sendfile() z roznym zachowaniem i prototypami. Nie nalezy stosowac tego wywolania w przenosnym programach. STANDARDY Brak. HISTORIA Linux 2.2, glibc 2.1. W Linuksie 2.4 i wczesniejszych, out_fd mogl odnosic sie takze do zwyklego pliku; ta mozliwosc zniknela w serii jader Linux 2.6.x, lecz przywrocono ja w Linuksie 2.6.33. Pierwotne, linuksowe wywolanie systemowe sendfile() nie bylo zaprojektowane do obslugi duzych przesuniec plikow. Z tego wzgledu w Linuksie 2.4 dodano sendfile64(), z szerszym typem argumentu offset. Funkcja opakowujaca sendfile() z glibc radzi sobie z roznicami w jadrze w sposob transparentny. UWAGI sendfile() dokona transferu co najwyzej 0x7ffff000 (2 147 479 552) bajtow, zwracajac liczbe bajtow faktycznie przeslanych (jest to prawdziwe zarowno dla systemow 32 jak i 64-bitowych). Jesli planuje sie uzywac sendfile() do wysylania plikow do gniazda TCP, lecz przed zawartoscia pliku trzeba dolaczyc jakies dane naglowka, przydatne bedzie korzystanie z opcji TCP_CORK, opisanej w podreczniku tcp(7), w celu ograniczenia liczby pakietow i poprawienia wydajnosci. Aplikacje moga uznac za stosowne awaryjnie korzystanie z read(2) i write(2) w przypadku, gdy sendfile() zawiedzie z bledem EINVAL lub ENOSYS. Jesli out_fd odnosi sie do gniazda lub potoku z obsluga zero-copy, wywolujacy musza upewnic sie, ze przesylane czesci pliku, do ktorych odnosi sie in_fd, pozostana niezmodyfikowane do momentu skonsumowania przeslanych danych przez odczytujacego na drugim koncu out_fd. Typowo linuksowe wywolanie splice(2) obsluguje przesylanie danych pomiedzy dwoma dowolnymi deskryptorami plikow, pod warunkiem, ze jeden (lub obydwa) z nich jest potokiem. ZOBACZ TAKZE copy_file_range(2), mmap(2), open(2), socket(2), splice(2) TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.15 17 maja 2025 r. sendfile(2)