分散读和集中写

Posted on 2023-03-01 11:19  lyc2002  阅读(35)  评论(0编辑  收藏  举报

介绍

#include <sys/uio.h>

ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

ssize_t readv(int fd, const struct iovec *iov, int iovcnt);

struct iovec {
    void  *iov_base;    /* Starting address */
    size_t iov_len;     /* Number of bytes to transfer */
};

功能:

  • writev 可以将分散保存在多个缓冲中的数据一并发送
  • readv 可以由多个缓冲分别接受

参数:

  • fd:传递/接受数据的文件描述符
  • iov:包含缓冲区的位置和大小
  • iovcnt:第二个参数数组长度

返回值:

  • 成功返回读入/写入的字节数
  • 失败返回 -1,并设置 errno

简单使用

#include <stdio.h>
#include <sys/uio.h>

int main()
{
    char buf1[] = "ABCDEFG";
    char buf2[] = "1234567";
    
    struct iovec vec[2];
    vec[0].iov_base = buf1;
    vec[0].iov_len = 3;
    vec[1].iov_base = buf2;
    vec[1].iov_len = 4;
    
    int str_len = writev(1, vec, 2);
    puts("");
    
    char buf3[10] = {0}, buf4[10] = {0};
    vec[0].iov_base = buf3;
    vec[0].iov_len = 5;
    vec[1].iov_base = buf4;
    vec[1].iov_len = 10;
    
    str_len = readv(0, vec, 2);
    printf("first message: %s\n", buf3);
    printf("second message: %s\n", buf4);
    
    return 0;
}

注意事项