《unix高级环境编程》高级 I/O—— readv 和 writev 函数

       当我们想要一次性对一个文件进行读、写多个非连续的缓冲区时,readv 和 writev 函数能够实现该功能。这两函数也称为散布读和聚集写。其定义如下:

/* 读、写多个非连续的缓冲区 */

/*
 * 函数功能:读取数据到多个非连续的缓冲区,或从多个非连续缓冲区写数据到文件;
 * 返回值:若成功则返回已读、写的字节数,若出错则返回-1;
 * 函数原型:
 */
#include <sys/uio.h>
ssize_t readv(int filedes, const struct iovec *iov, int iovcnt);
ssize_t writev(int filedes, const struct iovec *iov, int iovcnt);
/*
 * 说明:
 * iovec的指针结构如下:
 */
struct iovec
{
    void *iov_base;     /* starting address of buffer */
    size_t iov_len;     /* size of buffer */
};

       下图说明了 readv 和 writev 的参数和 iovec 结构:


        writev 以顺序 iov[0],iov[1] 至 iov[iovcnt-1] 从缓冲区中聚集输出数据。writev 返回输出的字节总数。readv 则将读入的数据按照上述同样顺序散布到缓冲区中,readv 总是先填满一个缓冲区,然后再填写下一个。readv 返回读到的总字节数。如果遇到文件结尾,已无数据可读,则返回0。

测试程序:

#include "apue.h"
#include <sys/uio.h>
#include <stdlib.h>
int main(void)
{
    struct iovec iov[2];
    char *buf1 = (char *)malloc(5);
    char *buf2 = (char *)malloc(1024);
    memset(buf1, 0, 5);
    memset(buf2, 0, 1024);
    iov[0].iov_base = buf1;
    iov[1].iov_base = buf2;
    iov[0].iov_len = 5;
    iov[1].iov_len = 1024;

    ssize_t nread, nwrite;
    nread = readv(STDIN_FILENO, iov, 2);
    if(nread == -1)
        err_sys("readv error");
    else
    {
        printf("readv:\n");
        printf("buf1 is: %s\t length is: %d\n",buf1, strlen(buf1));
        printf("buf2 is: %s\t length is: %d\n",buf2, strlen(buf2));
    }
    printf("writev:\n");
    nwrite = writev(STDOUT_FILENO, iov, 2);
    if(nwrite == -1)
        err_sys("writev error");

    free(buf1);
    free(buf2);
    exit(0);

}

输出结果:

readv writev and apue
readv:
buf1 is: readv	 length is: 5
buf2 is:  writev and apue
	 length is: 17
writev:
readv writev and apue

参考资料:

《UNIX高级环境编程》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值