Scroll to navigation

VMSPLICE(2) Руководство программиста Linux VMSPLICE(2)

ИМЯ

vmsplice - splice user pages into a pipe

СИНТАКСИС

#define _GNU_SOURCE         /* см. feature_test_macros(7) */
#include <fcntl.h>
#include <sys/uio.h>
ssize_t vmsplice(int fd, const struct iovec *iov,
                 unsigned long nr_segs, unsigned int flags);

ОПИСАНИЕ

The vmsplice() system call maps nr_segs ranges of user memory described by iov into a pipe. The file descriptor fd must refer to a pipe.

Указатель iov указывает на массив структур iovec, определённых в <sys/uio.h>:


struct iovec {

void *iov_base; /* начальный адрес */
size_t iov_len; /* количество байт */ };

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

Не используется в vmsplice(); см. splice(2).
Не блокировать ввод-вывод; подробности в splice(2).
В данный момент никак не влияет при указании в vmsplice(), но это может измениться; см. splice(2).
Предоставить ядру пользовательские страницы. Приложение, возможно, не изменяло эту память, иначе страничный кэш и данные на диске будут различны. Передача страниц ядру означает, что последующий вызов splice(2) с флагом SPLICE_F_MOVE сможет переместить страницы; если этот флаг не указан, то последующий splice(2) с флагом SPLICE_F_MOVE должен скопировать страницы. Также, данные должны быть выровнены по странице: по адресам памяти и размеру.

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

При успешном выполнении vmsplice() возвращается количество байт, переданных в канал. При ошибке vmsplice() возвращает -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

В указан flags SPLICE_F_NONBLOCK, и операция вызвала бы блокировку.
Неправильное значение fd или оно не указывает на канал.
Значение nr_segs больше IOV_MAX; или, если задан SPLICE_F_GIFT, не выровнена память.
Не хватает памяти.

ВЕРСИИ

Системный вызов vmsplice() впервые появился в Linux 2.6.17; поддержка в glibc добавлена в версии 2.5.

СООТВЕТСТВИЕ СТАНДАРТАМ

Данный вызов есть только в Linux.

ЗАМЕЧАНИЯ

Вызов vmsplice() следует другим функциям векторизованного чтения/записи при возникновении ограничений на количество передаваемых сегментов. Это ограничение равно IOV_MAX, определяемое в <limits.h>. Сейчас это значение равно 1024.

СМ. ТАКЖЕ

splice(2), tee(2), pipe(7)

ЗАМЕЧАНИЯ

Эта страница является частью проекта Linux man-pages версии 4.16. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy Ovchinnikov <dmitriyxt5@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Katrin Kutepova <blackkatelv@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

15 сентября 2017 г. Linux