名称: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 数组元素的个数返回值:若成功则返回已读、写的字节数,若出错则返回-1readv和writev函数用于在一次函数调用中读、写多个非连续缓冲区。有时也将这两个函数成为散布读和聚集写。 这两个函数的第二个参数是指向iovec结构数组的一个指针: View Code
writev以顺序iov[0]至iov[iovcnt-1]从缓冲区中聚集输出数据。writev返回输出的字节总数,通常,它应等于所有缓冲区长度之和。 readv则将读入的数据按上述同样顺序散布读到缓冲区中。readv总是先填满一个缓冲区,然后再填写下一个。readv返回读到的总字节数。如果遇到文件结尾,已无数据可读,则返回0。下面就是读多个缓冲区的例子: 1 struct iovec 2 { 3 void * iov_base; 4 size_t iov_len; 5 }
View Code
先用vi或cat建立三个文件(test1,test2,test3),test写入123456789,test写入abcdefghi. test3为空。然后运行命令:#./a.out test1 test2 test3在屏幕上会输出:test1 size is:9test2 size is:9test3 size is:18打开test3,文件内容为123456789abcdefghi.程序先把test1和test2的内容分别读到缓冲区buf1和buf2中。然后用write把buf1和buf2的内容写至test3. 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 }