博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
散布读/聚集写 readv/writev
阅读量:5935 次
发布时间:2019-06-19

本文共 1721 字,大约阅读时间需要 5 分钟。

名称:readv/writev

功能:散布读/聚集写

头文件:#include <sys/uio.h>
函数原形:  ssize_t readv(int filedes, const struct iovec *iov, int iovcnt);
                ssize_t writev(int filedes, const struct iovec *iov, int iovcnt);
参数:filedes     文件描述符
         iov       指向iovec结构数组的一个指针。
         iovcnt     数组元素的个数
返回值:若成功则返回已读、写的字节数,若出错则返回-1
readv和writev函数用于在一次函数调用中读、写多个非连续缓冲区。有时也将这两个函数成为散布读和聚集写。
       这两个函数的第二个参数是指向iovec结构数组的一个指针:

ContractedBlock.gif
ExpandedBlockStart.gif
View Code
 
1
struct
iovec
2
{
3
 
void
*
iov_base;
4
size_t iov_len;
5
}

       writev以顺序iov[0]至iov[iovcnt-1]从缓冲区中聚集输出数据。writev返回输出的字节总数,通常,它应等于所有缓冲区长度之和。
       readv则将读入的数据按上述同样顺序散布读到缓冲区中。readv总是先填满一个缓冲区,然后再填写下一个。readv返回读到的总字节数。如果遇到文件结尾,已无数据可读,则返回0。
下面就是读多个缓冲区的例子:

ContractedBlock.gif
ExpandedBlockStart.gif
View Code
 
1
#include
<
sys
/
uio.h
>
2
#include
<
stdio.h
>
3
#include
<
fcntl.h
>
4
5
 
int
main(
int
argc,
char
*
argv[])
6
{
7
ssize_t size;
8
char
buf1[
9
];
9
char
buf2[
9
];
10
struct
iovec iov[
2
];
11
12
fd1
=
open(argv[
1
],O_RDONLY);
13
fd2
=
open(argv[
2
],O_RDONLY);
14
fd3
=
open(argv[
3
],O_WRONLY);
15
16
size
=
read(fd1,buf1,
sizeof
(buf1));
17
printf(“
%
s size
is
:
%
d\n”,argv[
1
],size);
18
19
size
=
read(fd2,buf2,
sizeof
(buf2));
20
printf(“
%
s size
is
:
%
d\n”,argv[
2
],size);
21
22
iov[
0
].iov_base
=
buf1;
23
iov[
0
].iov_len
=
sizeof
(buf1);
24
iov[
1
].iov_base
=
buf2;
25
iov[
1
].iov_len
=
sizeof
(buf2);
26
27
size
=
writev(fd3,iov,
2
));
28
printf(“
%
s size
is
:
%
d\n”,argv[
3
],size);
29
30
close(fd1);
31
close(fd2);
32
close(fd3);
33
}

先用vi或cat建立三个文件(test1,test2,test3),test写入123456789,test写入abcdefghi. test3为空。
然后运行命令:
#./a.out test1 test2 test3
在屏幕上会输出:
test1 size is:9
test2 size is:9
test3 size is:18
打开test3,文件内容为123456789abcdefghi.
程序先把test1和test2的内容分别读到缓冲区buf1和buf2中。然后用write把buf1和buf2的内容写至test3.

转载于:https://www.cnblogs.com/floatedclouds/archive/2011/04/22/2025103.html

你可能感兴趣的文章
关于System.Collections空间
查看>>
MPP(大规模并行处理)
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
POJ2348 UVa10368 HDU1525 Euclid's Game【博弈】
查看>>
Java 位运算
查看>>
好用的CSS模块化打包工具CSS-COMBO
查看>>
python 中的字符和字符串
查看>>
C#Winform限制Textbox只能输入数字
查看>>
USACO 3.1.4 [Shaping Regions]
查看>>
EL表达式经典用法
查看>>
java.lang.NoClassDefFoundError: javax/mail/Authenticator
查看>>
联想集团涨超7% 杨元庆持股比例升至8.12%
查看>>
各省光伏十三五规划汇总:总规模将超130GW
查看>>
Apache Storm 官方文档 —— 常用模式
查看>>
聊聊JVM的年轻代
查看>>
lvm逻辑卷管理
查看>>
VS2010不能断点/下断的问题
查看>>
[Android]权限处理
查看>>
Spark bind on port 0. Attempting port 1 问题解决
查看>>
大端、小端字节序
查看>>