定义
struct iovec 结构体定义了一个向量元素,通常这个 iovec 结构体用于一个多元素的数组,对于每一个元素,iovec 结构体的字段 iov_base 指向一个缓冲区,这个缓冲区存放的是网络接收的数据(read),或者网络将要发送的数据(write)。iovec 结构体的字段 iov_len 存放的是接收数据的最大长度(read),或者实际写入的数据长度(write)。
一般 struct iovec 结构体的通常定义为:
struct iovec {
/* Starting address (内存起始地址)*/
void *iov_base;
/* Number of bytes to transfer(这块内存长度) */
size_t iov_len;
};
在 linux 中,使用这样的结构体变量作为参数的函数很多,常见的包括:
#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);
ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);
ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt,off_t offset);
ssize_t preadv2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);
ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);
示例
示例代码,向终端(屏幕)打印字符串:i am happy:
/*************************************************************************
* File Name: struct_iovec.c
* Author: The answer
* Function: Other
* Mail: 2412799512@qq.com
* Created Time: 2017年06月17日 星期六 20时36分21秒
************************************************************************/
#include<stdio.h>
#include<sys/uio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdlib.h>
#include<string.h>
void sys_err(const char *ptr,int num)
{
perror(ptr);
exit(-1);
}
int main(int argc,char **argv)
{
struct iovec iov[3];
char *p1 = "i";
char *p2 = " am";
char *p3 = " happy.\n";
iov[0].iov_base = p1;
iov[0].iov_len = strlen(p1);
iov[1].iov_base = p2;
iov[1].iov_len = strlen(p2);
iov[2].iov_base = p3;
iov[2].iov_len = strlen(p3);
ssize_t ret = writev(STDOUT_FILENO,iov,3);
if(ret < 0)
{
sys_err("writev",-1);
}
return 0;
}
网友评论