Provided by: manpages-ru-dev_4.27.0-1_all bug

НАИМЕНОВАНИЕ

       splice - подключает данные к каналу/выбирает данные из канала

БИБЛИОТЕКА

       Стандартная библиотека языка C (libc, -lc)

ОБЗОР

       #define _GNU_SOURCE         /* см. 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()  перемещает  данные  между двумя файловыми дескрипторами не выполняя при этом копирование
       между адресным пространством пользователя  и  ядра.  Он  пересылает  до  len  байт  данных  из  файлового
       дескриптора  fd_in  в  файловый  дескриптор fd_out, где один из файловых дескрипторов должен ссылаться на
       канал.

       К fd_in и off_in применяются следующие правила:

       •  Если fd_in указывает на канал, то значение off_in должно быть NULL.

       •  Если fd_in не указывает на канал и off_in равно NULL, то из fd_in читаются байты  начиная  с  смещения
          файла и это смещение соответственно изменяется.

       •  Если  fd_in  не  указывает  на  канал  и  off_in не равно NULL, то off_in должен указывать на буфер, в
          котором задаётся начальное смещение для чтения байтов из fd_in; в этом случае файловое смещение  fd_in
          не изменяется.

       Аналогичные правила относятся и к fd_out и off_out.

       Аргумент flags представляет собой битовую маску, которая составляется логическим сложением (OR) следующих
       значений:

       SPLICE_F_MOVE
              Пытаться  переместить  страницы,  а  не  копировать  их.  Используется  только как подсказка ядру:
              страницы всё равно будут копироваться, если ядро не сможет переместить  страницы  из  канала,  или
              если  буферы  канала  не  ссылаются  на  полные  страницы.  Первая  реализация  этого флага была с
              дефектами: поэтому начиная с Linux 2.6.21 этот флаг ни на что не влияет (но по прежнему разрешён в
              вызове splice()); в будущем, возможно появится корректная реализация.

       SPLICE_F_NONBLOCK
              Не блокировать при вводе-выводе. Это делает  операции  соединения  с  каналом  неблокируемыми,  но
              splice(),  тем  не  менее, может заблокироваться, так как файловые дескрипторы, с которыми ведётся
              работа, могут блокироваться (если у них не установлен флаг O_NONBLOCK).

       SPLICE_F_MORE
              В следующем подключении будут дополнительные данные. Полезно указывать, когда fd_out ссылается  на
              сокет (смотрите также описание MSG_MORE в send(2) и описание TCP_CORK в tcp(7)).

       SPLICE_F_GIFT
              Не используется в splice(); смотрите vmsplice(2).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       При  успешном  выполнении  splice()  возвращает  количество  байт,  которые были записаны или получены из
       канала.

       Возвращаемое значение 0 означает конец ввода. Если fd_in указывает на канал, то  это  означает,  что  нет
       данных  для  передачи  и  и блокировка не имела бы смысла, так как нет писателей, подключённых к пишущему
       концу канала.

       В случае ошибки splice() возвращает -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

       EAGAIN В flags указан SPLICE_F_NONBLOCK или один из файловых дескрипторов был помечен  как  неблокирующий
              (O_NONBLOCK), и операция вызвала бы блокировку.

       EBADF  Один или оба файловых дескриптора недействительны или в неправильном режиме чтения-записи.

       EINVAL Целевая файловая система не поддерживает подключение данных (splicing).

       EINVAL Файл назначения открыт в режиме добавления.

       EINVAL Ни один из файловых дескрипторов не ссылается на канал.

       EINVAL Указано смещение для устройства этого не поддерживающего (например, канала).

       EINVAL Значение fd_in и fd_out указывают на один и тот же канал.

       ENOMEM Не хватает памяти.

       ESPIPE Значение  off_in  или  off_out  не равно NULL, но соответствующий файловый дескриптор ссылается на
              канал.

СТАНДАРТЫ

       Linux.

ИСТОРИЯ

       Linux 2.6.17, glibc 2.5.

       В Linux 2.6.30 и старее, только один из fd_in и fd_out должен быть каналом. Начиная с  Linux  2.6.31  оба
       параметра должны быть каналами.

ПРИМЕЧАНИЯ

       Три  системных  вызова  —  splice(),  vmsplice(2),  and tee(2), предоставляют пользовательским программам
       полный контроль над произвольным буфером ядра; они реализованы в ядре  на  базе  того  же  типа  буферов,
       который используется для канала. Эти системные вызовы выполняют следующие задачи:

       splice()
              перемещает  данные из буфера в произвольный файловый дескриптор или наоборот, и из одного буфера в
              другой.

       tee(2) «копирует» данные из одного буфера в другой.

       vmsplice(2)
              «копирует» данные из пользовательского пространства в буфер.

       Хотя мы говорим о копировании, на самом деле копирования, обычно, не происходит. Ядро реализует канальный
       буфер как набор указателей со счётчиком ссылок на страницы памяти ядра. Ядро создаёт  «копии»  страниц  в
       буфере  посредством  создания  новых  указателей  (для  выходного  буфера),  указывающих  на  страницы, и
       увеличивает счётчики ссылок страниц: копируются только указатели, а не страницы буфера.

       _FILE_OFFSET_BITS should be defined to be 64 in code that uses non-null off_in or off_out or  that  takes
       the address of splice, if the code is intended to be portable to traditional 32-bit x86 and ARM platforms
       where off_t's width defaults to 32 bits.

ПРИМЕРЫ

       См. tee(2).

СМОТРИТЕ ТАКЖЕ

       copy_file_range(2), sendfile(2), tee(2), vmsplice(2), pipe(7)

ПЕРЕВОД

       Русский  перевод  этой  страницы  руководства разработал(и) Alexander Golubev <fatzer2@gmail.com>, Azamat
       Hackimov  <azamat.hackimov@gmail.com>,  Hotellook,   Nikita   <zxcvbnm3230@mail.ru>,   Spiros   Georgaras
       <sng@hellug.gr>,  Vladislav  <ivladislavefimov@gmail.com>,  Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов
       <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот перевод является свободной программной документацией; он распространяется на условиях  общедоступной
       лицензии  GNU  (GNU  General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите  об  этом
       разработчику(ам)   по   его(их)  адресу(ам)  электронной  почты  или  по  адресу  списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                   2 мая 2024 г.                                        splice(2)