vmsplice(2)

ИМЯ
vmsplice - соединяет пользовательские страницы памяти с каналом

LIBRARY
Standard C library (libc, -lc)

СИНТАКСИС
#define _GNU_SOURCE         /* см. feature_test_macros(7) */
#include <fcntl.h>

ssize_t vmsplice(int fd, const struct iovec *iov,
                 size_t nr_segs, unsigned int flags);

ОПИСАНИЕ
Если fd открыт для записи, то системный вызов vmsplice() отображает nr_segs областей пользовательской памяти, описанных iov, в канал. Если fd открыт для чтения, то системный вызов vmsplice() заполняет nr_segs областей пользовательской памяти, описанных iov, из канала. Файловый дескриптор fd должен указывать на канал.

The pointer iov points to an array of iovec structures as described in iovec(3type).

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

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

SPLICE_F_NONBLOCK
    Не блокировать ввод-вывод; подробности в splice(2).

SPLICE_F_MORE
    В данный момент никак не влияет при указании в vmsplice(), но это может измениться; см. splice(2).

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

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении vmsplice() возвращается количество байт, переданных в канал. При ошибке vmsplice() возвращает -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EAGAIN
    В указан flags SPLICE_F_NONBLOCK, и операция вызвала бы блокировку.

EBADF
    Неправильное значение fd или оно не указывает на канал.

EINVAL
    Значение nr_segs больше IOV_MAX; или, если задан SPLICE_F_GIFT, не выровнена память.

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

ВЕРСИИ
The vmsplice() system call first appeared in Linux 2.6.17; library support was added in glibc 2.5.

СТАНДАРТЫ
Данный вызов есть только в Linux.

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

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

СМ. ТАКЖЕ
splice(2), tee(2), pipe(7)

ПЕРЕВОД
Русский перевод этой страницы руководства был сделан 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 (https://www.gnu.org/licenses/gpl-3.0.html) или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

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