readv() writev()

readv() - 聚集输入(Scatter Input)

函数原型

#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);

参数

  • 参数1:文件描述符
  • 参数2:指向iovec结构数据指针
  • 参数3:iovec数组中的元素数量(通常限制为IOV_MAX,Linux默认为1024)
  • 返回值:
    • 成功:读取的总字节数
    • 失败:-1,并设置errno

实例

// 从文件读取数据到两个缓冲区
struct iovec iov[2];
char header[100], body[1024];

iov[0].iov_base = header;
iov[0].iov_len = sizeof(header);
iov[1].iov_base = body;
iov[1].iov_len = sizeof(body);

ssize_t n = readv(file_fd, iov, 2);

writev() - 分散输出(Gather Output)

函数原型

#include <sys/uio.h>
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

参数

  • 参数1:文件描述符
  • 参数2:指向iovec结构数据指针
  • 参数3:iovec数组中的元素数量(通常限制为IOV_MAX,Linux默认为1024)
  • 返回值:
    • 成功:写入的总字节数
    • 失败:-1,并设置errno

实例

// 发送HTTP响应头和文件内容
struct iovec iov[2];
char response_header[512];
char *file_content = mmap(...); 

iov[0].iov_base = response_header;
iov[0].iov_len = strlen(response_header);
iov[1].iov_base = file_content;
iov[1].iov_len = file_size;

ssize_t n = writev(socket_fd, iov, 2);
posted @ 2025-07-29 13:18  北燃  阅读(9)  评论(0)    收藏  举报