散布读/聚集写 readv/writev

名称:readv/writev

功能:散布读/聚集写
头文件:#include
函数原形:  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

你可能感兴趣的:(散布读/聚集写 readv/writev)