iovec是一个结构体,用于描述一个数据缓冲区。它通常与readv和writev系统调用一起使用,用于在一次系统调用中读取或写入多个缓冲区。
iovec结构体定义如下:
struct iovec {
void *iov_base; // 缓冲区起始地址
size_t iov_len; // 缓冲区长度
};
readv和writev系统调用的原型如下:
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
其中,fd是文件描述符,iov是iovec结构体数组,iovcnt是数组元素个数。
下面是一些示例代码,用于演示如何使用iovec结构体和readv/writev系统调用。
读取多个缓冲区的数据:
#include <sys/uio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int fd = open("file.txt", O_RDONLY);
if (fd == -1) {
perror("open");
return -1;
}
char buf1[10];
char buf2[20];
struct iovec iov[2];
iov[0].iov_base = buf1;
iov[0].iov_len = sizeof(buf1);
iov[1].iov_base = buf2;
iov[1].iov_len = sizeof(buf2);
ssize_t nread = readv(fd, iov, 2);
if (nread == -1) {
perror("readv");
return -1;
}
printf("Read %zd bytes\n", nread);
printf("buf1: %s\n", buf1);
printf("buf2: %s\n", buf2);
close(fd);
return 0;
}
写入多个缓冲区的数据:
#include <sys/uio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int fd = open("file.txt", O_WRONLY);
if (fd == -1) {
perror("open");
return -1;
}
char buf1[] = "Hello, ";
char buf2[] = "world!";
struct iovec iov[2];
iov[0].iov_base = buf1;
iov[0].iov_len = sizeof(buf1) - 1; // 必须减一,因为结尾有一个空字符
iov[1].iov_base = buf2;
iov[1].iov_len = sizeof(buf2) - 1;
ssize_t nwritten = writev(fd, iov, 2);
if (nwritten == -1) {
perror("writev");
return -1;
}
printf("Wrote %zd bytes\n", nwritten);
close(fd);
return 0;
}