.\" -*- coding: UTF-8 -*- .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH splice 2 "17 maja 2025 r." "Linux man\-pages 6.15" .SH NAZWA splice \- przenosi dane do/z potoku .SH BIBLIOTEKA Standardowa biblioteka C (\fIlibc\fP,\ \fI\-lc\fP) .SH SKŁADNIA .nf \fB#define _GNU_SOURCE\fP /* Zob. feature_test_macros(7) */ \fB#define _FILE_OFFSET_BITS 64\fP \fB#include \fP .P .\" Return type was long before glibc 2.7 \fBssize_t splice(int \fP\fIfd_in\fP\fB, off_t *_Nullable \fP\fIoff_in\fP\fB,\fP \fB int \fP\fIfd_out\fP\fB, off_t *_Nullable \fP\fIoff_out\fP\fB,\fP \fB size_t \fP\fIsize\fP\fB, unsigned int \fP\fIflags\fP\fB);\fP .fi .SH OPIS \fBsplice\fP() przenosi dane pomiędzy dwoma deskryptorami plików, bez kopiowania pomiędzy przestrzenią adresową jądra i przestrzenią adresową użytkownika. Transferuje maksymalnie \fIsize\fP bajtów z deskryptora pliku \fIfd_in\fP do deskryptora pliku \fIfd_out\fP, przy czym jeden z deskryptorów plików musi odnosić się do potoku. .P \fIfd_in\fP i \fIoff_in\fP są objęte następującą semantyką: .IP \[bu] 3 Jeśli \fIfd_in\fP odnosi się do potoku, to \fIoff_in\fP musi wynosić NULL. .IP \[bu] Jeśli \fIfd_in\fP nie odnosi się do potoku, a \fIoff_in\fP wynosi NULL, to bajty są odczytywane z \fIfd_in\fP począwszy od przesunięcia pliku, a przesunięcie pliku jest odpowiednio dostosowywane. .IP \[bu] Jeśli \fIfd_in\fP nie odnosi się do pliku, a \fIoff_in\fP nie wynosi NULL, to \fIoff_in\fP musi wskazywać na bufor, określający początkowe przesunięcie, od którego zostaną odczytane bajty w \fIfd_in\fP; w tym przypadku przesunięcie pliku \fIfd_in\fP pozostaje bez zmian, w zamian odpowiednio dostosowywane jest przesunięcie, na które wskazuje \fIoff_in\fP. .P Analogiczne stwierdzenia stosują się do \fIfd_out\fP i \fIoff_out\fP. .P Argument \fIflags\fP jest maską bitową tworzoną jako suma logiczna (OR) zera lub większej liczby następujących wartości: .TP \fBSPLICE_F_MOVE\fP Próbuje przesunąć strony zamiast je kopiować. Jest to tylko wskazówka dla jądra: strony wciąż mogą być skopiowane, jeśli jądro nie może przesunąć stron z potoku lub jeśli bufory potoku nie odnoszą się do pełnych stron. Pierwotna implementacja tego znacznika była nieprawidłowa: z tego względu począwszy od Linuksa 2.6.21 nie odnosi on skutku (jednak wciąż jest dozwolony w wywołaniu do \fBsplice\fP()); w przyszłości może być przywrócona poprawna implementacja. .TP \fBSPLICE_F_NONBLOCK\fP Nie blokuje wejścia/wyjścia. Operacje splice na potoku będą nieblokujące, jednak \fBsplice\fP() wciąż może zablokować, ponieważ deskryptory plików do/z których następuje splice mogą blokować (chyba, że mają one ustawiony znacznik \fBO_NONBLOCK\fP). .TP \fBSPLICE_F_MORE\fP W kolejnym splice nadejdzie więcej danych. Jest to przydatna wskazówka, gdy \fIfd_out\fP odnosi się do gniazda (zob. też opis \fBMSG_MORE\fP w \fBsend\fP(2) oraz opis \fBTCP_CORK\fP w \fBtcp\fP(7)). .TP \fBSPLICE_F_GIFT\fP Nieużywane w \fBsplice\fP(); zob. \fBvmsplice\fP(2). .SH "WARTOŚĆ ZWRACANA" Po pomyślnym zakończeniu \fBsplice\fP() zwraca liczbę bajtów przeniesionych do lub z potoku. .P Zwracana wartość 0 oznacza koniec wejścia. Jeśli \fIfd_in\fP 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. .P W razie wystąpienia błędu \fBsplice\fP zwraca \-1 i ustawia \fIerrno\fP, wskazując błąd. .SH BŁĘDY .TP \fBEAGAIN\fP We \fIflags\fP podano \fBSPLICE_F_NONBLOCK\fP lub jeden z deskryptorów plików oznaczono jako nieblokujący (\fBO_NONBLOCK\fP), natomiast operacja spowodowałaby blokowanie. .TP \fBEBADF\fP Jeden lub więcej deskryptorów plików nie jest prawidłowych lub nie mają prawidłowego trybu do odczytu i zapisu. .TP \fBEINVAL\fP Docelowy system plików nie obsługuje operacji splice. .TP \fBEINVAL\fP .\" The append-mode error is given since Linux 2.6.27; in earlier kernels, .\" splice() in append mode was broken Docelowy plik jest otwarty w trybie dopisywania. .TP \fBEINVAL\fP Żaden z deskryptorów plików nie odnosi się do potoku. .TP \fBEINVAL\fP Podano przesunięcie dla urządzenia, które nie jest przewijalne (np. potok). .TP \fBEINVAL\fP \fIfd_in\fP i \fIfd_out\fP odnoszą się do tego samego potoku. .TP \fBENOMEM\fP Brak pamięci. .TP \fBESPIPE\fP \fIoff_in\fP albo \fIoff_out\fP nie miały wartości NULL, a odpowiadający deskryptor pliku odnosił się do potoku. .SH STANDARDY Linux. .SH HISTORIA Linux 2.6.17, glibc 2.5. .P .\" commit 7c77f0b3f9208c339a4b40737bb2cb0f0319bb8d W Linuksie 2.6.30 i wcześniejszych, dokładnie jeden z argumentów \fIfd_in\fP i \fIfd_out\fP musiał być potokiem. Od Linuksa 2.6.31 oba argumenty mogą odnosić się do potoków. .SH UWAGI Trzy wywołania systemowe: \fBsplice\fP(), \fBvmsplice\fP(2) i \fBtee\fP(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: .TP \fBsplice\fP() przenosi dane z bufora do dowolnego deskryptora pliku lub na odwrót, lub z jednego bufora do innego. .TP \fBtee\fP(2) \[Bq]kopiuje\[rq] dane z jednego bufora do drugiego. .TP \fBvmsplice\fP(2) \[Bq]kopiuje\[rq] dane z przestrzeni użytkownika do bufora. .P .\" .\" Linus: Now, imagine using the above in a media server, for example. .\" Let's say that a year or two has passed, so that the video drivers .\" have been updated to be able to do the splice thing, and what can .\" you do? You can: .\" .\" - splice from the (mpeg or whatever - let's just assume that the video .\" input is either digital or does the encoding on its own - like they .\" pretty much all do) video input into a pipe (remember: no copies - the .\" video input will just DMA directly into memory, and splice will just .\" set up the pages in the pipe buffer) .\" - tee that pipe to split it up .\" - splice one end to a file (ie "save the compressed stream to disk") .\" - splice the other end to a real-time video decoder window for your .\" real-time viewing pleasure. .\" .\" Linus: Now, the advantage of splice()/tee() is that you can .\" do zero-copy movement of data, and unlike sendfile() you can .\" do it on _arbitrary_ data (and, as shown by "tee()", it's more .\" than just sending the data to somebody else: you can duplicate .\" the data and choose to forward it to two or more different .\" users - for things like logging etc.). .\" 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 \[Bq]kopie\[rq] 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. .P \fB_FILE_OFFSET_BITS\fP powinno być zdefiniowane jako 64 w kodzie, który używa wartości \fIoff_in\fP lub \fIoff_out\fP innych niż null lub takim, który przyjmuje adres \fBsplice\fP, jeśli kod ma być przenośny na tradycyjne, 32\-bitowe platformy x86 i ARM, w których szerokość \fBoff_t\fP domyślnie wynosi 32 bity. .SH PRZYKŁADY Inny przykład opisano w podręczniku \fBtee\fP(2). .P .\" SRC BEGIN (splice.c) .EX \& #define _GNU_SOURCE #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include \& int main(void) { int fd; int pfd[2]; off_t off; const char s[14] = "Witaj swiecie!"; \& fd = open("out", O_WRONLY | O_CREAT | O_EXCL, 0666); if (fd == \-1) err(EXIT_FAILURE, "open"); \& if (pipe(pfd) == \-1) err(EXIT_FAILURE, "pipe"); \& if (write(pfd[1], s, sizeof(s)) != sizeof(s)) err(EXIT_FAILURE, "write"); if (close(pfd[1]) == \-1) err(EXIT_FAILURE, "close"); \& off = 10; if (splice(pfd[0], NULL, fd, &off, sizeof(s), 0) != sizeof(s)) err(EXIT_FAILURE, "splice"); if (close(pfd[0]) == \-1) err(EXIT_FAILURE, "close"); \& printf("Nowy przesunięcie wynosi %jd\[rs]n", (intmax_t) off); \& if (close(fd) == \-1) err(EXIT_FAILURE, "close"); exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "ZOBACZ TAKŻE" \fBcopy_file_range\fP(2), \fBsendfile\fP(2), \fBtee\fP(2), \fBvmsplice\fP(2), \fBpipe\fP(7) .PP .SH TŁUMACZENIE Tłumaczenie niniejszej strony podręcznika: Michał Kułach . .PP Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License w wersji 3 .UE lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI. .PP Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej .MT manpages-pl-list@lists.sourceforge.net .ME .