.\" -*- coding: UTF-8 -*-
.\" This manpage is Copyright (C) 2006 Jens Axboe
.\" and Copyright (C) 2006 Michael Kerrisk <mtk.manpages@gmail.com>
.\"
.\" SPDX-License-Identifier: Linux-man-pages-copyleft
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH splice 2 "2 maja 2024 r." "Linux man\-pages 6.9.1" 
.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 <fcntl.h>\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\fIlen\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 \fIlen\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 potoku, a \fIoff_in\fP nie wynosi NULL, to
\fIoff_in\fP musi wskazywać na bufor określający początkowe przesunięcie, z
którego zostaną odczytane bajty w \fIfd_in\fP; w tym przypadku przesunięcie
pliku w \fIfd_in\fP nie ulega zmianie.
.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
Zob. \fBtee\fP(2).
.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 <michal.kulach@gmail.com>
.
.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 .
