《unix高级环境编程》高级 I/O—— readv 和 writev 函数
来源:互联网 发布:谜一样的双眼知乎 编辑:程序博客网 时间:2024/06/05 02:23
当我们想要一次性对一个文件进行读、写多个非连续的缓冲区时,readv 和 writev 函数能够实现该功能。这两函数也称为散布读和聚集写。其定义如下:
- /* 读、写多个非连续的缓冲区 */
- /*
- * 函数功能:读取数据到多个非连续的缓冲区,或从多个非连续缓冲区写数据到文件;
- * 返回值:若成功则返回已读、写的字节数,若出错则返回-1;
- * 函数原型:
- */
- #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);
- /*
- * 说明:
- * iovec的指针结构如下:
- */
- struct iovec
- {
- void *iov_base; /* starting address of buffer */
- size_t iov_len; /* size of buffer */
- };
下图说明了 readv 和 writev 的参数和 iovec 结构:
writev 以顺序 iov[0],iov[1] 至 iov[iovcnt-1] 从缓冲区中聚集输出数据。writev 返回输出的字节总数。readv 则将读入的数据按照上述同样顺序散布到缓冲区中,readv 总是先填满一个缓冲区,然后再填写下一个。readv 返回读到的总字节数。如果遇到文件结尾,已无数据可读,则返回0。
测试程序:
- #include "apue.h"
- #include <sys/uio.h>
- #include <stdlib.h>
- int main(void)
- {
- struct iovec iov[2];
- char *buf1 = (char *)malloc(5);
- char *buf2 = (char *)malloc(1024);
- memset(buf1, 0, 5);
- memset(buf2, 0, 1024);
- iov[0].iov_base = buf1;
- iov[1].iov_base = buf2;
- iov[0].iov_len = 5;
- iov[1].iov_len = 1024;
- ssize_t nread, nwrite;
- nread = readv(STDIN_FILENO, iov, 2);
- if(nread == -1)
- err_sys("readv error");
- else
- {
- printf("readv:\n");
- printf("buf1 is: %s\t length is: %d\n",buf1, strlen(buf1));
- printf("buf2 is: %s\t length is: %d\n",buf2, strlen(buf2));
- }
- printf("writev:\n");
- nwrite = writev(STDOUT_FILENO, iov, 2);
- if(nwrite == -1)
- err_sys("writev error");
- free(buf1);
- free(buf2);
- exit(0);
- }
输出结果:
- readv writev and apue
- readv:
- buf1 is: readv length is: 5
- buf2 is: writev and apue
- length is: 17
- writev:
- readv writev and apue
0 0
- 《unix高级环境编程》高级 I/O—— readv 和 writev 函数
- 《unix高级环境编程》高级 I/O—— readv 和 writev 函数
- 《UNIX环境高级编程》笔记--readv和writev函数
- 《UNIX网络编程01》 第十三章 高级I/O函数 readv、writev
- 高级I/O(七)--readv和writev函数
- UNIX环境高级编程——标准I/O库函数和Unbuffered I/O函数
- 《unix高级环境编程》高级 I/O——非阻塞 I/O
- 《unix高级环境编程》高级 I/O—— I/O 多路复用
- 《unix高级环境编程》高级 I/O—— 存储映射 I/O
- 《unix高级环境编程》高级 I/O——非阻塞 I/O
- 《unix高级环境编程》高级 I/O—— I/O 多路转接
- 《unix高级环境编程》高级 I/O—— 存储映射 I/O
- UNIX环境高级编程——文件I/O
- UNIX环境高级编程——标准I/O库
- UNIX环境高级编程——标准I/O库
- Unix环境高级编程——文件I/O
- 《UNIX环境高级编程》 —— I/O
- 《UNIX环境高级编程》读书笔记 —— 文件 I/O
- Servlet<4>
- 《unix高级环境编程》高级 I/O—— I/O 多路转接
- Ubuntu系统下Hadoop 2.0.4集群安装配置
- 中科院博士教你如何查找外文文献
- 第十三周项目六:体验文件操作3.0
- 《unix高级环境编程》高级 I/O—— readv 和 writev 函数
- 【计算几何初步-线段相交】【HDU1089】线段交点
- MediaPlayer和AudioTrack播放Audio的区别与联系
- 新旧代码兼容
- python 开始! Python 关于 name main的使用
- JavaFX使用摄像头API的示例
- 进程-IPC 共享内存和消息队列 (三)
- 《unix高级环境编程》高级 I/O—— 存储映射 I/O
- Python中的sorted函数以及operator.itemgetter函数