Linux IO 1 - lixiao-c/Daily_learning GitHub Wiki
I/O vector,与readv和wirtev操作相关的结构体。readv和writev函数用于在一次函数调用中读、写多个非连续缓冲区。有时也将这两个函数称为散布读(scatter read)和聚集写(gather write)。
#include <sys/uio.h>
/* Structure for scatter/gather I/O. */
struct iovec{
void *iov_base; /* Pointer to data. */
size_t iov_len; /* Length of data. */
};
成员iov_base指向一个缓冲区,这个缓冲区是存放readv所接收的数据或是writev将要发送的数据。
成员iov_len确定了接收的最大长度以及实际写入的长度。
read和write的衍生函数,readv和writev可以在一个原子操作中读取或写入多个缓冲区。
#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
fd是要在其上进行读或是写的文件描述符;iov是读或写所用的I/O向量;iovcnt是要使用的向量元素个数。
运用实例:
/*
* 将三个独立的字符串一次写入终端。*
* */
#include <sys/uio.h>
int main(int argc,char **argv)
{
char part1[] = "This is iov";
char part2[] = " and ";
char part3[] = " writev test";
struct iovec iov[3];
iov[0].iov_base = part1;
iov[0].iov_len = strlen(part1);
iov[1].iov_base = part2;
iov[1].iov_len = strlen(part2);
iov[2].iov_base = part3;
iov[2].iov_len = strlen(part3);
writev(1,iov,3);
return 0;
}
pread函数相当于先后调用了lseek和read函数,但是还是有区别的,有以下两点区别:
pread函数是原子操作,而先后调用两个函数不是原子操作
pread函数是不会改变当前文件偏移量的,而read和write函数会改变当前文件偏移量
(pwrite函数类似)
参考文献
高级I/O之writev和readv函数,https://www.cnblogs.com/nufangrensheng/p/3559304.html