writev() - Unix、Linux 系统调用
Tutorials Point


  Unix 初学者指南
  Unix Shell 编程
  高级 Unix
  Unix 有用参考
  Unix 有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论论坛     关于 TP  

writev() - Unix、Linux 系统调用


previous next AddThis Social Bookmark Button

广告

名称

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

参见



previous next Printer Friendly

广告


  

广告



广告