跳转至

uio

uio 模块提供了分散/聚集 I/O(Scatter/Gather I/O)操作接口,允许单次系统调用在多个不连续内存缓冲区与文件描述符之间进行数据传输,减少系统调用次数,提升 I/O 效率。

头文件清单:

#include "open_source/musl/include/sys/uio.h"

接口清单

接口名称 功能简述
readv 从文件描述符读取数据到多个分散的内存缓冲区
writev 将多个分散的内存缓冲区数据写入文件描述符

Functions

readv

函数声明

ssize_t readv(int fd, const struct iovec *iov, int iovcnt)

头文件清单

#include "open_source/musl/include/sys/uio.h"

功能说明

  • 从指定的文件描述符fd中读取数据,按顺序填充到iov数组所指向的多个分散内存缓冲区中
  • 每个iovec元素指定一个独立缓冲区的起始地址和长度,readv依次向各缓冲区写入数据
  • 调用成功时返回实际读取的字节总数,到达文件末尾时返回0

前置条件

  • 调用时序约束:文件描述符fd必须已通过open()等接口成功打开,且具备读权限(O_RDOK)
  • 依赖关系:iov指针非空,iov数组中iovcnt个元素的iov_base与iov_len需合法;iovcnt取值范围为1 ~ UIO_MAXIOV

入参

名称 参数类型 详细说明 约束取值范围
fd int 文件描述符,指定待读取的文件 有效的已打开文件描述符
iov const struct iovec * 指向iovec结构体数组的指针,每个元素指定一个缓冲区 非NULL;iov_len之和不超过SSIZE_MAX
iovcnt int iov数组中的元素个数 1 ~ 1024

返回值

  • 返回类型:ssize_t
返回值 文字含义 触发场景
> 0 实际读取的字节数 成功读取数据
0 到达文件末尾 无更多数据可读
-1 读取失败 fd无效、无读权限、iov指针非法、iovcnt超范围等,errno被设置

writev

函数声明

ssize_t writev(int fd, const struct iovec *iov, int iovcnt)

头文件清单

#include "open_source/musl/include/sys/uio.h"

功能说明

  • 将iov数组所指向的多个分散内存缓冲区中的数据,按顺序写入到指定的文件描述符fd中
  • 每个iovec元素指定一个独立缓冲区的起始地址和长度,writev依次从各缓冲区读取数据并写入文件
  • 调用成功时返回实际写入的字节总数

前置条件

  • 调用时序约束:文件描述符fd必须已通过open()等接口成功打开,且具备写权限(O_WROK)
  • 依赖关系:iov指针非空,iov数组中iovcnt个元素的iov_base与iov_len需合法;iov_len之和不超过SSIZE_MAX

入参

名称 参数类型 详细说明 约束取值范围
fd int 文件描述符,指定待写入的文件 有效的已打开文件描述符
iov const struct iovec * 指向iovec结构体数组的指针,每个元素指定一个缓冲区 非NULL;iov_len之和不超过SSIZE_MAX
iovcnt int iov数组中的元素个数 1 ~ 1024

返回值

  • 返回类型:ssize_t
返回值 文字含义 触发场景
> 0 实际写入的字节数 成功写入数据
-1 写入失败 fd无效、无写权限、iov指针非法、iovcnt超范围、磁盘空间不足等,errno被设置

Structures

iovec

struct iovec { void *iov_base; size_t iov_len; };

成员说明

成员名称 数据类型 描述
iov_base void * 缓冲区起始地址
iov_len size_t 缓冲区长度(字节数)

Macros

UIO_MAXIOV

#define UIO_MAXIOV 1024