IO流程中IO向量iovec
作者: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的更多相关文章
- golang io中io.go解读
目录 1. 整体大纲 2. 接口 读 写 关闭 寻址 3. 函数 读 写 复制 4. 结构体 SectionReader LimitedReader teeReader 5. 备注 根据golang ...
- 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程
简述C#中IO的应用 在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...
- 【转】IO流程
原文地址:http://blog.chinaunix.net/uid-26922071-id-3954900.html IO之流程与buffer概览 为了说明这个流程,还是用图来描述一下比较直观. ...
- IO流程及优化
http://blog.csdn.net/xypzwl/article/details/51416883 一.存储设备的存储原理 机械硬盘: 机械硬盘使用磁性物质作为存储介质,用N.S极性来代表0或1 ...
- Linux 0.11源码阅读笔记-文件IO流程
文件IO流程 用户进程read.write在高速缓冲块上读写数据,高速缓冲块和块设备交换数据. 什么时机将磁盘块数据读到缓冲块? 什么时机将缓冲块数据刷到磁盘块? 函数调用关系 read/write( ...
- Java中IO流,输入输出流概述与总结
总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...
- 揭开Java IO流中的flush()的神秘面纱
大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...
- java.io包中的字节流—— FilterInputStream和FilterOutputStream
接着上篇文章,本篇继续说java.io包中的字节流.按照前篇文章所说,java.io包中的字节流中的类关系有用到GoF<设计模式>中的装饰者模式,而这正体现在FilterInputStre ...
- 黑马程序员——【Java基础】——File类、Properties集合、IO包中的其他类
---------- android培训.java培训.期待与您交流! ---------- 一.File类 (一)概述 1.File类:文件和目录路径名的抽象表现形式 2.作用: (1)用来将文件或 ...
随机推荐
- mysql命令[转]
来自:http://www.cnblogs.com/zhangzhu/archive/2013/07/04/3172486.html 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录my ...
- Android 5.0及以上版本使用webview不能存储第三方Cookies解决方案
Android 5.0以上的手机使用原生WebView浏览网页,在进行登录的时候会提示验证码错误,通过查找5.0以上系统的api文档,发现5.0以上版本的webview做了较大的改动,如:同步cook ...
- centos6.7搭建DHCP服务器
centos6.7搭建DHCP服务 2017-03-24 09:47:16 系统环境: centos6.7 安装之前首先使用rpm –qa | grep dhcp查看系统中是否已安装了dhcp软件包. ...
- Authorization user to use specifical database
DENY VIEW any DATABASE to PUBLIC;ALTER AUTHORIZATION ON DATABASE::Best TO Best
- c++学习笔记之封装篇(上)
title: c++学习笔记之封装篇(上) date: 2017-03-12 18:59:01 tags: [c++,c,封装,类] categories: [学习,程序员,c/c++] --- 一. ...
- 基于均值漂移的三维网格分割算法(Mean Shift)
mean shift算法是一种强大的无参数离散数据点的聚类方法,其在图像平滑.图像分割以及目标跟踪等方面都有着广泛的应用.[Yamauchi et al. 2005]基于mean shift算法提出了 ...
- [Python]获取子线程异常信息
起因 今天在写东西的时候,用到了多线程.遇到了个问题: 子线程的异常,在父线程中无法捕获. 解决 问题代码 问题代码示例代码如下: import threading class SampleThrea ...
- Tcl与Design Compiler (十一)——其他的时序约束选项(二)
本文如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/ ,作者:IC_learner 前面介绍的设计都不算很复杂,都是使用时钟的默认行为 ...
- 老李分享:为何要使用 Web Services
老李分享:为何要使用 Web Services poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询q ...
- ArcGIS API for JavaScript 4.2学习笔记[20] 使用参数查询要素(油井和地震关系)
这个例子相当复杂.我先简单说说这个例子是干啥的. 在UI上,提供了一个下拉框.两个滑动杆,以确定三个参数,使用这三个参数进行空间查询.这个例子就颇带空间查询的意思了. 这个例子是干嘛的呢?第一个参数是 ...