writev() - 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 库中的函数;结果将是不确定的,并且可能不是您想要的。
参见
广告
|