table of contents
VMSPLICE(2) | Руководство программиста Linux | VMSPLICE(2) |
ИМЯ¶
vmsplice - соединяет пользовательские страницы памяти с каналом
ОБЗОР¶
#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);
ОПИСАНИЕ¶
Системный вызов vmsplice() отображает nr_segs областей пользовательской памяти, описанных iov, в канал. Файловый дескриптор fd должен указывать на канал.
Указатель iov указывает на массив структур iovec, определённых в <sys/uio.h>:
struct iovec {
void *iov_base; /* начальный адрес */
size_t iov_len; /* количество байт */ };
Аргумент 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 устанавливается в соответствующее значение.
ОШИБКИ¶
ВЕРСИИ¶
Системный вызов vmsplice() впервые появился в Linux 2.6.17; поддержка в glibc добавлена в версии 2.5.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
Данный вызов есть только в Linux.
ЗАМЕЧАНИЯ¶
Вызов vmsplice() следует другим функциям векторизованного чтения/записи при возникновении ограничений на количество передаваемых сегментов. Это ограничение равно IOV_MAX, определяемое в <limits.h>. На момент написания страницы его значение равнялось 1024.
СМОТРИТЕ ТАКЖЕ¶
2012-05-04 | Linux |