《unix高级环境编程》高级 I/O—— readv 和 writev 函数

来源:互联网 发布:谜一样的双眼知乎 编辑:程序博客网 时间:2024/06/05 02:23

 当我们想要一次性对一个文件进行读、写多个非连续的缓冲区时,readv 和 writev 函数能够实现该功能。这两函数也称为散布读和聚集写。其定义如下:

[cpp] view plaincopy
  1. /* 读、写多个非连续的缓冲区 */  
  2.   
  3. /* 
  4.  * 函数功能:读取数据到多个非连续的缓冲区,或从多个非连续缓冲区写数据到文件; 
  5.  * 返回值:若成功则返回已读、写的字节数,若出错则返回-1; 
  6.  * 函数原型: 
  7.  */  
  8. #include <sys/uio.h>  
  9. ssize_t readv(int filedes, const struct iovec *iov, int iovcnt);  
  10. ssize_t writev(int filedes, const struct iovec *iov, int iovcnt);  
  11. /* 
  12.  * 说明: 
  13.  * iovec的指针结构如下: 
  14.  */  
  15. struct iovec  
  16. {  
  17.     void *iov_base;     /* starting address of buffer */  
  18.     size_t iov_len;     /* size of buffer */  
  19. };  

       下图说明了 readv 和 writev 的参数和 iovec 结构:


        writev 以顺序 iov[0],iov[1] 至 iov[iovcnt-1] 从缓冲区中聚集输出数据。writev 返回输出的字节总数。readv 则将读入的数据按照上述同样顺序散布到缓冲区中,readv 总是先填满一个缓冲区,然后再填写下一个。readv 返回读到的总字节数。如果遇到文件结尾,已无数据可读,则返回0。

测试程序:

[cpp] view plaincopy
  1. #include "apue.h"  
  2. #include <sys/uio.h>  
  3. #include <stdlib.h>  
  4. int main(void)  
  5. {  
  6.     struct iovec iov[2];  
  7.     char *buf1 = (char *)malloc(5);  
  8.     char *buf2 = (char *)malloc(1024);  
  9.     memset(buf1, 0, 5);  
  10.     memset(buf2, 0, 1024);  
  11.     iov[0].iov_base = buf1;  
  12.     iov[1].iov_base = buf2;  
  13.     iov[0].iov_len = 5;  
  14.     iov[1].iov_len = 1024;  
  15.   
  16.     ssize_t nread, nwrite;  
  17.     nread = readv(STDIN_FILENO, iov, 2);  
  18.     if(nread == -1)  
  19.         err_sys("readv error");  
  20.     else  
  21.     {  
  22.         printf("readv:\n");  
  23.         printf("buf1 is: %s\t length is: %d\n",buf1, strlen(buf1));  
  24.         printf("buf2 is: %s\t length is: %d\n",buf2, strlen(buf2));  
  25.     }  
  26.     printf("writev:\n");  
  27.     nwrite = writev(STDOUT_FILENO, iov, 2);  
  28.     if(nwrite == -1)  
  29.         err_sys("writev error");  
  30.   
  31.     free(buf1);  
  32.     free(buf2);  
  33.     exit(0);  
  34.   
  35. }  

输出结果:

[cpp] view plaincopy
  1. readv writev and apue  
  2. readv:  
  3. buf1 is: readv   length is: 5  
  4. buf2 is:  writev and apue  
  5.      length is: 17  
  6. writev:  
  7. readv writev and apue  
0 0
原创粉丝点击