| splice(2) | System Calls Manual | splice(2) |
splice - przenosi dane do/z potoku
Standardowa biblioteka C (libc, -lc)
#define _GNU_SOURCE /* Zob. feature_test_macros(7) */ #define _FILE_OFFSET_BITS 64 #include <fcntl.h>
ssize_t splice(int fd_in, off_t *_Nullable off_in,
int fd_out, off_t *_Nullable off_out,
size_t len, unsigned int flags);
splice() przenosi dane pomiędzy dwoma deskryptorami plików, bez kopiowania pomiędzy przestrzenią adresową jądra i przestrzenią adresową użytkownika. Transferuje maksymalnie len bajtów z deskryptora pliku fd_in do deskryptora pliku fd_out, przy czym jeden z deskryptorów plików musi odnosić się do potoku.
fd_in i off_in są objęte następującą semantyką:
Analogiczne stwierdzenia stosują się do fd_out i off_out.
Argument flags jest maską bitową tworzoną jako suma logiczna (OR) zera lub większej liczby następujących wartości:
Po pomyślnym zakończeniu splice() zwraca liczbę bajtów przeniesionych do lub z potoku.
Zwracana wartość 0 oznacza koniec wejścia. Jeśli fd_in odnosi się do potoku, oznacza to, że nie było danych do transferu, zatem blokowanie nie miało sensu, ponieważ nie było zapisujących do końca do zapisu potoku.
W razie wystąpienia błędu splice zwraca -1 i ustawia errno, wskazując błąd.
Linux.
Linux 2.6.17, glibc 2.5.
W Linuksie 2.6.30 i wcześniejszych, dokładnie jeden z argumentów fd_in i fd_out musiał być potokiem. Od Linuksa 2.6.31 oba argumenty mogą odnosić się do potoków.
Trzy wywołania systemowe: splice(), vmsplice(2) i tee(2) zapewniają programom w przestrzeni użytkownika pełną kontrolę nad pewnym buforem jądra, zaimplementowanym w jądrze używając tego samego typu bufora, jaki jest używany dla potoku. Ogólnie, te wywołania systemowe spełniają następujące role:
Choć mowa tu o kopiowaniu, generalnie unika się faktycznego kopiowania. Jądro dokonuje tego implementując bufor potoku jako zbiór wskaźników, z licznikami odniesień, do stron pamięci jądra. Jądro tworzy „kopie” stron w buforze, tworząc nowe wskaźniki (dla bufora wyjściowego) odnoszące się do stron oraz zwiększając liczniki odniesień do stron: kopiowane są tylko wskaźniki, a nie strony bufora.
_FILE_OFFSET_BITS powinno być zdefiniowane jako 64 w kodzie, który używa wartości off_in lub off_out innych niż null lub takim, który przyjmuje adres splice, jeśli kod ma być przenośny na tradycyjne, 32-bitowe platformy x86 i ARM, w których szerokość off_t domyślnie wynosi 32 bity.
Zob. tee(2).
copy_file_range(2), sendfile(2), tee(2), vmsplice(2), pipe(7)
Tłumaczenie niniejszej strony podręcznika: Michał Kułach <michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.
| 2 maja 2024 r. | Linux man-pages 6.9.1 |