readv() - Unix,Linux 系统调用
广告
名称
readv、writev - 读取或写入数据到多个缓冲区
语法
#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *vector, int count);
ssize_t writev(int fd, const struct iovec *vector, int count);
|
描述
readv() 函数从与文件描述符 fd 关联的文件中读取 count 个块到由 vector 描述的多个缓冲区中。
writev() 函数最多将由 vector 描述的 count 个块写入与文件描述符 fd 关联的文件。
指针 vector 指向一个 struct iovec 结构体,该结构体在 <sys/uio.h> 中定义为
struct iovec {
void *iov_base; /* Starting address */
size_t iov_len; /* Number of bytes */
};
|
缓冲区按指定的顺序处理。readv() 函数的工作方式与 read(2) 相同,只是填充了多个缓冲区。
writev() 函数的工作方式与 write(2) 相同,只是写出了多个缓冲区。
返回值
成功时,readv() 函数返回读取的字节数;writev() 函数返回写入的字节数。错误时,返回 -1,并且 errno 被相应地设置。
错误
错误与 read(2) 和 write(2) 中给出的相同。此外,还定义了以下错误
| 标签 | 描述 |
|
EINVAL | iov_len 值的总和超过了 ssize_t 值。或者,向量计数 count 小于零或大于允许的最大值。 |
符合标准
4.4BSD(readv() 和 writev() 函数首次出现在 4.2BSD 中),POSIX.1-2001。Linux libc5 使用 size_t 作为 count 参数的类型,并使用 int 作为这些函数的返回类型。
Linux 说明
POSIX.1-2001 允许实现对可以传递到 vector 中的项目数量设置限制。实现可以通过在 <limits.h> 中定义 IOV_MAX 或在运行时通过 sysconf(_SC_IOV_MAX) 的返回值来宣传其限制。在 Linux 上,这些机制宣传的限制为 1024,这是真正的内核限制。
但是,如果 glibc 包装函数检测到底层内核系统调用失败是因为此限制被超过,则会执行一些额外的工作。在 readv() 的情况下,包装函数会分配一个足够大的临时缓冲区来容纳 vector 指定的所有项目,将该缓冲区传递给 read() 的调用,将数据从缓冲区复制到 vector 元素的 iov_base 字段指定的位置,然后释放缓冲区。
writev() 的包装函数使用临时缓冲区和对 write() 的调用执行类似的任务。
错误
不建议混合使用诸如 readv() 或 writev() 之类的在文件描述符上操作的函数与 stdio 库中的函数;结果将是未定义的,并且可能不是您想要的。
参见
广告
|