作者:Younger Liu,本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

为了提高从磁盘读取数据到内存的效率,引入了IO向量机制,IO向量即struct iovec,在API接口在readv和writev中使用,当然其他地方也较多的使用它。抛砖引玉,聊一下自己对iovec的了解。

readv & writev

readv接口:从文件描述符fd所对应的的文件中读去count个数据段到多个buffers中,该buffer用iovec描述,原型:

#include <sys/uio.h>

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

writev接口:把count个数据buffer(使用iovec描述)写入到文件描述符fd所对应的的文件中,原型:

#include <sys/uio.h>

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

iovec说明

struct iovec成为IO向量,其结构如下;

#include <sys/uio.h>

struct iovec{

void *iov_base; /* pointer to the start of buffer */

size_t iov_len; /* size of buffer in bytes */

}

很明显,iov_base作为一个指针,用于记录buffer地址(一般为用户态地址),iov_len表示buffer的大小。

在用户态或内核态中使用时,一般均采用指针的形式:struct iovec *iov。当然一般也给出其元素的个数count。

如何读写哪?将按照iov[0]、iov[1]、…、iov[count-1]的顺序依次读写,并且他们在文件中的地址是连续的。

返回值:(1) 成功,返回读写的字节数,这个字节数是所有iovec结构中iov_len的总和;(2)失败返回-1,并设置好errno。

iov_len的总和不能超过SSIZE_MAX,count需要大于0,小于IOV_MAX(<limits.h>中),在linux为1024, 否则返回-1,errno设置为EINVAL,

实例

writev:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/uio.h> int main(){
struct iovec iov[3];
ssize_t nr;
int fd,i; char *buf[] = {
"The term buccaneer comes from the word boucan.\n",
"A boucan is a wooden frame used for cooking meat.\n",
"Buccaneer is the West Indies name for a pirate.\n"
}; fd = open("buccaneer.txt",O_WRONLY | O_CREAT | O_TRUNC);
if( fd == -1 ){
perror("open");
return 1;
} for(i = 0; i < 3; i++){
iov[i].iov_base = buf[i];
iov[i].iov_len = strlen(buf[i]);
} nr = writev(fd,iov,3);
if(nr == -1){
perror("writev");
return 1;
}
printf("wrote %d bytes\n",nr); if(close(fd)){
perror("close");
return 1;
}
return 0;
}

readv:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/uio.h> int main(){
char foo[48],bar[51],baz[49];
struct iovec iov[3];
ssize_t nr;
int fd,i; fd = open("buccaneer.txt",O_RDONLY);
if(fd == -1){
perror("open");
return 1;
} iov[0].iov_base = foo;
iov[0].iov_len = sizeof(foo);
iov[1].iov_base = bar;
iov[1].iov_len = sizeof(bar);
iov[2].iov_base = baz;
iov[2].iov_len = sizeof(baz); nr = readv(fd,iov,3);
if(nr == -1){
perror("readv");
return 1;
} for(i = 0; i < 3; i++){
printf("%d: %s",i,(char *)iov[i].iov_base);
} if(close(fd)){
perror("close");
return 1;
}
return 0;
}

致谢

http://fuliang.iteye.com/blog/652297

作者:Younger Liu,本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

IO流程中IO向量iovec的更多相关文章

  1. golang io中io.go解读

    目录 1. 整体大纲 2. 接口 读 写 关闭 寻址 3. 函数 读 写 复制 4. 结构体 SectionReader LimitedReader teeReader 5. 备注 根据golang ...

  2. 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程

    简述C#中IO的应用   在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...

  3. 【转】IO流程

    原文地址:http://blog.chinaunix.net/uid-26922071-id-3954900.html IO之流程与buffer概览 为了说明这个流程,还是用图来描述一下比较直观.   ...

  4. IO流程及优化

    http://blog.csdn.net/xypzwl/article/details/51416883 一.存储设备的存储原理 机械硬盘: 机械硬盘使用磁性物质作为存储介质,用N.S极性来代表0或1 ...

  5. Linux 0.11源码阅读笔记-文件IO流程

    文件IO流程 用户进程read.write在高速缓冲块上读写数据,高速缓冲块和块设备交换数据. 什么时机将磁盘块数据读到缓冲块? 什么时机将缓冲块数据刷到磁盘块? 函数调用关系 read/write( ...

  6. Java中IO流,输入输出流概述与总结

    总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...

  7. 揭开Java IO流中的flush()的神秘面纱

    大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...

  8. java.io包中的字节流—— FilterInputStream和FilterOutputStream

    接着上篇文章,本篇继续说java.io包中的字节流.按照前篇文章所说,java.io包中的字节流中的类关系有用到GoF<设计模式>中的装饰者模式,而这正体现在FilterInputStre ...

  9. 黑马程序员——【Java基础】——File类、Properties集合、IO包中的其他类

    ---------- android培训.java培训.期待与您交流! ---------- 一.File类 (一)概述 1.File类:文件和目录路径名的抽象表现形式 2.作用: (1)用来将文件或 ...

随机推荐

  1. TypeScript设计模式之组合、享元

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...

  2. Ubuntu 16.04安装DB2 Express C v11.1

    欢迎和大家交流技术相关问题:邮箱: jiangxinnju@163.com博客园地址: http://www.cnblogs.com/jiangxinnjuGitHub地址: https://gith ...

  3. JS把命名空间传递给模块形式

    //方法依赖 jquery 或者其他 有扩展方法 extend() 类库  例如: underscore.js 链接地址 http://underscorejs.org var app = {}; ( ...

  4. Redis(2015.08.03笔记一)

    一.redis简介 Redis是一种面向"键/值"对数据类型的内存数据库,可以满足我们对海量数据的读写需求. redis的键只能是字符串 redis的值支持多种数据类型: 1:字符 ...

  5. 【转】并行类加载——让tomcat玩转双十一 @双十一实战

    原文:https://yq.aliyun.com/articles/4227?spm=5176.100239.yqblog1.20.cfRztB 摘要: 今年双十一,是应用容器的最新版本Ali-tom ...

  6. Markdowm入门

    今天介绍一种非常好用的小巧性标记语言--Markdown,熟悉它的语法规则,这将会节省你很多编辑文本文档格式的时间,提高你的工作效率和学习效率. 一.什么是Markdown Markdown是一种可以 ...

  7. Java Swing客户端小项目

    记录一下两个用java swing写的客户端. 项目1: 关键词:swing  jtable 代码如下: 1.主类: package com.my.agent.client; import java. ...

  8. mvalidator手机端校验

    官网地址:https://github.com/efri-yang/mobileValidate#%E5%8F%82%E6%95%B0 使用方法: html如下: <li class=" ...

  9. 想系统的学习一下项目管理,推荐PRINCE2

    参加pmp培训,考个pmp证书就足矣应付面试. 个人并不推荐看那些外文原版书籍,我看过一两本,水平与实用性并不是你想象的那么好,除非你是做理论研究,为了发表论文. 另一本就推荐prince2的教材,p ...

  10. 性能测试培训: 监控CPU之python

    性能测试培训: 监控CPU之python 作为一名测试开发工程师,开发脚本是为了测试服务的,我们在手里没有性能监控工具的情况下,我们会自己来进行开发脚本完成监控任务.下面是python监控cpu '' ...