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);
Если fd открыт для записи, то системный вызов vmsplice() отображает nr_segs областей пользовательской памяти, описанных iov, в канал. Если fd открыт для чтения, то системный вызов vmsplice() заполняет nr_segs областей пользовательской памяти, описанных iov, из канала. Файловый дескриптор fd должен указывать на канал.
Указатель iov указывает на массив структур iovec, определённых в <sys/uio.h>:
struct iovec { void *iov_base; /* начальный адрес */ size_t iov_len; /* количество байт */ };
Аргумент flags представляет собой битовую маску, которая составляется логическим сложением (OR) следующих значений:
При успешном выполнении vmsplice() возвращается количество байт, переданных в канал. При ошибке vmsplice() возвращает -1, а errno устанавливается в соответствующее значение.
Системный вызов vmsplice() впервые появился в Linux 2.6.17; поддержка в glibc добавлена в версии 2.5.
Данный вызов есть только в Linux.
Вызов vmsplice() следует другим функциям векторизованного чтения/записи при возникновении ограничений на количество передаваемых сегментов. Это ограничение равно IOV_MAX, определяемое в <limits.h>. Сейчас это значение равно 1024.
Настоящую стыковку vmsplice() поддерживает только для отображения пользовательской памяти в канал. В обратном направлении, в действительности, он просто копирует данные в пользовательское пространство. Но это делает интерфейс приятным и симметричным, и позволяет людям строить на vmsplice() с пространством будущего улучшения производительности.
2019-03-06 | Linux |