uio
uio 模块提供了分散/聚集 I/O(Scatter/Gather I/O)操作接口,允许单次系统调用在多个不连续内存缓冲区与文件描述符之间进行数据传输,减少系统调用次数,提升 I/O 效率。
头文件清单:
接口清单
| 接口名称 | 功能简述 |
|---|---|
| readv | 从文件描述符读取数据到多个分散的内存缓冲区 |
| writev | 将多个分散的内存缓冲区数据写入文件描述符 |
Functions
readv
函数声明
头文件清单
功能说明
- 从指定的文件描述符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
函数声明
头文件清单
功能说明
- 将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
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| iov_base | void * | 缓冲区起始地址 |
| iov_len | size_t | 缓冲区长度(字节数) |