VMSPLICE - Linux手册页
时间:2019-08-20 17:59:37 来源:igfitidea点击:
Linux程序员手册 第2部分
更新日期: 2019-03-06
名称
vmsplice-向/从管道拼接用户页面
语法
#define _GNU_SOURCE /* See 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()系统调用会将iov所描述的用户内存的nr_segs范围映射到管道中。如果打开fd进行读取,则vmsplice()系统调用将从管道中填充iov描述的用户内存的nr_segs范围。文件描述符fd必须引用管道。
指针iov指向iovec结构的数组,定义如下:
struct iovec { void *iov_base; /* Starting address */ size_t iov_len; /* Number of bytes */ };
flags参数是一个位掩码,由以下零个或多个以下值组成或:
- SPLICE_F_MOVE
- 未用于vmsplice();参见splice(2)。
- SPLICE_F_NONBLOCK
- 不要阻塞I / O;有关更多详细信息,请参见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
- 在标志中指定了SPLICE_F_NONBLOCK,该操作将被阻止。
- EBADF
- fd无效或未引用管道。
- EINVAL
- nr_segs大于IOV_MAX;如果设置了SPLICE_F_GIFT,则内存未对齐。
- ENOMEM
- 内存不足。
版本
vmsplice()系统调用首先出现在Linux 2.6.17中;它在2.6.17中发布。库支持已在2.5版中添加到glibc。
遵循规范
此系统调用是特定于Linux的。
备注
关于传入的段数限制,vmsplice()遵循其他矢量化的读/写类型函数。此限制为IOV_MAX,如中所定义。当前,此限制为1024。
vmsplice()实际上仅支持从用户内存到管道的真正拼接。相反,它实际上只是将数据复制到用户空间。但这使接口变得美观且对称,并使人们能够在vmsplice()上构建,并为将来的性能改进留有空间。
另外参见
接头(2),三通(2),管道(7)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。