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/