man(2) readv writev
#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
unix高级环境编程中的定义:
【ssize_t readv(int filedes,const struct iovec iov[ ],int iovcnt) ;
ssize_t writev(int filedes,const struct iovec iov[ ],int iovcnt) ; 】
----------------------------------------------------------------------------
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #include <sys/uio.h>
6 #include <unistd.h>
7
8 int main()
9 {
10 struct iovec iov[2];
11 char buf[12],str[12];
12 int fd = open("1.txt",O_RDONLY);
13 if(fd == -1)
14 return -1;
15 iov[0].iov_base = buf;
16 iov[0].iov_len = 12;
17 iov[1].iov_base = str;
18 iov[1].iov_len = 12;
19 int n = readv(fd, iov, 2);
buf[11] = 0;//添加这个
20 printf("n:%d\n", n);
21 //printf("buf:%s\n",buf);
22 //printf("str:%s\n",str);
23 puts(buf);
24 puts(str);
25 close(fd);
26 return 0;
27 }
----------------------------------------------------------------------------
运行结果很奇怪:第一个缓冲区溢出了
tarena@ubuntu:~/mon$ ./a.out
n:23
buf:aaaaaaaaaaaabbbbbbbbbb
str:bbbbbbbbbb
解决办法:
int main()
9 {
10 struct iovec iov[3];
11 char buf[13],str[13],str2[13];
12 int fd = open("1.txt",O_RDONLY);
13 if(fd == -1)
14 return -1;
15 iov[0].iov_base = buf;
16 iov[0].iov_len = 12;
17 iov[1].iov_base = str;
18 iov[1].iov_len = 12;
19 iov[2].iov_base = str2;
20 iov[2].iov_len = 12;
21 int n = readv(fd, iov, 3);
22 buf[12] = 0;
23 str[12] = 0;
24 printf("n:%d\n", n);
25 printf("buf:%s\n",buf);
26 printf("str:%s\n",str);
27 printf("str2:%s\n",str2);
28 close(fd);
29 return 0;
30 }
当你要读入12个的时候申请13个存储空间读入的长度iov_len = 12,并且手动在末尾添加字符串结束标志。
----------------------------------------------------------------------------
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
----------------------------------------------------------------------------
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #include <sys/uio.h>
6 #include <unistd.h>
7 #include <string.h>
8 int main()
9 {
10 struct iovec iov[2];
11 char buf[12] = "hello,lyy",str[12] = "nihao,lyy";
12 int fd = open("2.txt",O_WRONLY | O_CREAT);
13 if(fd == -1)
14 return -1;
15 iov[0].iov_base = buf;
16 iov[0].iov_len = strlen(buf);
17 iov[1].iov_base = str;
18 iov[1].iov_len = strlen(str);
19 int n = writev(fd, iov, 2);
20 printf("n:%d\n", n);
21 close(fd);
22 return 0;
23 }
----------------------------------------------------------------------------
运行结果正确,但是为什么需要超级用户才能查看呢?
tarena@ubuntu:~/mon$ sudo cat 2.txt
hello,lyynihao,lyytarena@ubuntu:~/mon$
----------------------------------------------------------------------------
ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #include <sys/uio.h>
6 #include <unistd.h>
7 int main()
8 {
9 int fd = open("4.txt",O_RDWR|O_CREAT);
10 if(fd == -1) return -1;
11 struct iovec iov[3];
12 char str1[12],str2[12],str3[12];
13 iov[0].iov_base = str1;
14 iov[0].iov_len = 3;
15 iov[1].iov_base = str2;
16 iov[1].iov_len = 4;
17 iov[2].iov_base = str3;
18 iov[2].iov_len = 5;
19 preadv(fd, iov, 3, 4);
20 str1[iov[0].iov_len] = 0;
21 str2[iov[1].iov_len] = 0;
22 str3[iov[2].iov_len] = 0;
23 printf("str1:%s\nstr2:%s\nstr3:%s\n",str1,str2,str3);
24 close(fd);
25 return 0;
26 }
ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset);
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #include <sys/uio.h>
6 #include <unistd.h>
7 #include <string.h>
8 int main()
9 {
10 int fd = open("4.txt",O_RDWR|O_CREAT);
11 if(fd == -1) return -1;
12 struct iovec iov[3];
13 char str1[12] = "hello,lyy",str2[12] = "nihao,lyy",str3[36] = "nice to meet you";
14 iov[0].iov_base = str1;
15 iov[0].iov_len = strlen(str1);
16 iov[1].iov_base = str2;
17 iov[1].iov_len = strlen(str2);
18 iov[2].iov_base = str3;
19 iov[2].iov_len = strlen(str3);
20 pwritev(fd, iov, 3, 3);
21 close(fd);
22 return 0;
23 }
--------------------------------------------------------------------------------------------------------
这两个举例不太好举
ssize_t preadv2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);
flags:RWF_SYNC RWF_DSYNC
ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);
flags:RWF_NOWAI
---------------------------------------------
RWF_HIPRI只用于下列条件
其中this feature is usable only on a file descriptor opened using the O_DIRECT flag.
---------------------------------------------------------------------------------------------------------
#include <unistd.h>
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
从第offset个开始读
1 #include <stdio.h>
2 #include <string.h>
3 #include <unistd.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7
8 int main()
9 {
10 char buf[12];
11 int fd = open("3.txt",O_RDONLY);
12 int n = pread(fd, buf, 12,3);
13 buf[n] = 0;
14 printf("n = %d buf:%s\n",n,buf);
15 close(fd);
16 return 0;
17 }
返回值比实际读到的多一个,手动buf[n]置为0
-------------------------------------------------------------------------------------
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
从第offset个开始写,从0开始;(略)
man(2) readv writev的更多相关文章
- readv writev示例程序
当 readv() 时候,需要程序自己提供space,接收数据. #include <stdio.h> #include <stdlib.h> #include <str ...
- 套接字I/O函数write/read writev/readv send/recv sendto/recvfrom sendmsg/recvmsg
函数原型 read/write系原型 #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); #include ...
- RMAN备份失败: ORA-19502 & ORA-27072: File I/O error
早上检查一ORACLE数据库的RMAN备份的邮件时,发现出现了ORA-27072: File I/O error等错误,具体信息如下所示: channel ORA_DISK_1: starting p ...
- Linux Socket编程
“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...
- Socket通信原理探讨(C++为例)
一.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 1.消息传递(管道.FIFO.消息队列) 2.同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 3 ...
- Linux Socket编程(不限Linux)【转】
转自:http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几 ...
- 字符设备驱动之Led驱动学习记录
一.概述 Linux内核就是由各种驱动组成的,内核源码中大约有85%的各种渠道程序的代码.一般来说,编写Linux设备驱动大致流程如下: 1.查看原理图,数据手册,了解设备的操作方法. 2.在内核中找 ...
- [12]APUE:高级 I/O
一.分散聚离(向量) I/O [a] readv / writev #include <sys/uio.h> ssize_t readv(int fd, const struct iove ...
- SOCKet 编程 简介
“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...
随机推荐
- 3D Computer Grapihcs Using OpenGL - 08 Text File Shaders
使用之前的方法写Shader是一件很痛苦的事情,把Shader代码直接卸载C++文件中,需要使用很多引号来包裹,既不美观也不方便. 我们这节的目的是使用纯文本文件保存Shader. 首先在工程中创建两 ...
- [BZOJ4205][FJ2015集训]卡牌配对
题目:卡牌配对 传送门:None 题目大意:有$n_1$张$X$类牌和$n_2$张$Y$类类牌,每张卡牌上有三个属性值:$A,B,C$.两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属 ...
- [CSP-S模拟测试]:大佬(kat)(数学期望)
题目描述 辣鸡$ljh\ NOI$之后就退役了,然后就滚去学文化课了.他发现$katarina$大佬真是太强了,于是就学习了一下$katarina$大佬的做题方法.比如这是一本有$n$道题的练习册,$ ...
- Linux shell -查找字符(find,xargs,grep)
在当前目录下查找含有jmxremote字符的文件 test@>find . -type f|xargs grep "jmxremote" . 当前目录 -type 查找文件类 ...
- 消息队列之 ActiveMQ
简介 ActiveMQ 特点 ActiveMQ 是由 Apache 出品的一款开源消息中间件,旨在为应用程序提供高效.可扩展.稳定.安全的企业级消息通信. 它的设计目标是提供标准的.面向消息的.多语言 ...
- PHP版本问题
PHP 5.3以下版本 无法用下标直接取得函数返回的数组 eg: $val_0 = explode(',', $val)[0]//报错 #要改成: $exploded_val = explode(', ...
- curl发json
linux 模拟post请求 curl -X POST \ -H "Content-Type: application/json" \ -H "token:GXJP1cl ...
- 测开之路一百二十四:flask之MVC响应过程
MVC流程 原本的请求响应 结构: 视图: from flask import Flask, render_template app = Flask(__name__) @app.route(&quo ...
- drop_duplicates()函数
1dataframe删除某一列的重复元素,默认只留下第一次出现的 inplace参数设置为true时直接在原数据上修改,为False时,生成副本. 注意所有函数中inplace一旦设置为True,此时 ...
- element-ui走马灯如何实现图片自适应 长度和高度 自适应屏幕大小
最近写用vue2.0写一个项目,用到了走马灯效果,由于项目赶时间,想偷下懒,第一次引用了element组件(纯JS也可以写的出来,赶时间嘛,懂得....),结果用了发现一个问题,element的组件( ...