news 2026/7/17 6:25:24

【2018-01-19】【转】Linux的readv和writev

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【2018-01-19】【转】Linux的readv和writev

[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2018-01-19| 标题:【转】Linux的readv和writev分类:操作系统 / linux


linux readv/writev 简单笔记

本文转自【 http://blog.csdn.net/ieearth/article/details/46730669 】

readv和writev函数是Linux中的两个系统调用,类似于read和write函数,不同的是,readv和writev在一次执行过程中可以原子地作用于多个缓冲区,这些缓冲区常常是非连续的。readv和writev的原型如下:

#include<sys/uio.h>ssize_treadv(intfd,conststructiovec*iov,intiovcnt);ssize_twritev(intfd,conststructiovec*iov,intiovcnt);structiovec{void*iov_base;/* Starting address */size_tiov_len;/* Number of bytes to transfer */};

readv和writev的第一个参数fd是个文件描述符,第二个参数是指向iovec数据结构的一个指针,其中iov_base为缓冲区首地址,iov_len为缓冲区长度,参数iovcnt指定了iovec的个数。函数调用成功时返回读、写的总字节数,失败时返回-1并设置相应的errno。

在一次函数调用中,writev以顺序iov[0]、iov[1]至iov从各缓冲区中聚集输出数据到fd,readv则将从fd读入的数据按同样的顺序散布到各缓冲区中,readv总是先填满一个缓冲区,然后再填下一个,因此,writev称为gather output,readv称为scatter input。

先来看一个writev的例子,指定了两个缓冲区,str0和str1,内容输出到标准输出,并打印实际输出的字节数。

// writevex.c#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<sys/uio.h>intmain(){char*str0="hello ";char*str1="world ";structioveciov[2];ssize_tnwritten;iov[0].iov_base=str0;iov[0].iov_len=strlen(str0);iov[1].iov_base=str1;iov[1].iov_len=strlen(str1);nwritten=writev(STDOUT_FILENO,iov,2);printf("%ld bytes written.",nwritten);exit(EXIT_SUCCESS);}
$ gcc writevex.c $ ./a.out hello world12bytes written.

再来看一个readv的例子,从标准输入读数据,缓冲区为长度是(8 - 1)的buf1和buf2,并打印读到的字节总数和两个缓冲区各自的内容。

// readvex.c#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<sys/uio.h>intmain(){charbuf1[8]={0};charbuf2[8]={0};structioveciov[2];ssize_tnread;iov[0].iov_base=buf1;iov[0].iov_len=sizeof(buf1)-1;iov[1].iov_base=buf2;iov[1].iov_len=sizeof(buf2)-1;nread=readv(STDIN_FILENO,iov,2);printf("%ld bytes read.",nread);printf("buf1:%s ",buf1);printf("buf2:%s ",buf2);exit(EXIT_SUCCESS);}
$ gcc readvex.c $ ./a.out helloreadv11bytes read. buf1: hellore buf2: adv
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/17 6:24:55

x86保护模式下的DispInt与DispAL函数解析

1. pmtest7.asm背景与功能定位在x86实模式向保护模式切换的经典实验中&#xff0c;pmtest7.asm是一个具有教学意义的汇编代码示例。这个文件通常出现在操作系统开发或计算机系统结构课程中&#xff0c;主要演示如何从16位实模式切换到32位保护模式&#xff0c;并展示基本的内存…

作者头像 李华
网站建设 2026/7/17 6:24:46

Windows 10系统操作与应用9小时视频教程

1. Windows 10系统操作与应用视频教程概述这个9小时的Windows 10系统操作与应用视频教程&#xff0c;是为想要系统学习Windows 10操作系统的用户设计的全面学习资源。无论你是刚接触Windows 10的新手&#xff0c;还是希望提升系统操作效率的中级用户&#xff0c;这套教程都能提…

作者头像 李华
网站建设 2026/7/17 6:24:01

OpenVLA复现指南:具身智能工程化落地的完整实践

1. 项目概述&#xff1a;为什么“复现并理解 OpenVLA”不是一句空话&#xff0c;而是当前机器人智能落地的关键切口“复现并理解 OpenVLA”这六个字&#xff0c;在2025年春季的AI工程圈里&#xff0c;已经不是学术论文里的一个章节标题&#xff0c;而是一条真实存在的技术分水岭…

作者头像 李华
网站建设 2026/7/17 6:23:26

开源AI CRM系统:架构解析与智能应用实践

1. 开源AI CRM系统的时代背景与核心价值在数字化转型浪潮席卷全球的当下&#xff0c;企业客户关系管理正经历着从传统工具到智能平台的质变。开源AI CRM系统的出现&#xff0c;标志着客户关系管理进入了"智能协同"的新阶段。这类系统将开源软件的灵活性与人工智能的预…

作者头像 李华
网站建设 2026/7/17 6:23:22

魔搭+OpenVINO加速Qwen3-TTS CPU语音合成实战

1. 项目概述&#xff1a;为什么在CPU上跑Qwen3-TTS&#xff0c;还要专门搭一套“魔搭OpenVINO”链路&#xff1f; 你有没有试过直接用 transformers 加载Qwen3-TTS跑语音合成&#xff1f;我试过——在一台i7-11800H的笔记本上&#xff0c;合成一句20秒的中文&#xff0c;端到…

作者头像 李华
网站建设 2026/7/17 6:21:38

CrewAI单元测试实战:用Pytest与Mock构建AI智能体测试体系

1. 项目概述&#xff1a;为什么CrewAI的单元测试如此重要&#xff1f; 最近在折腾CrewAI项目&#xff0c;发现社区里关于如何给它写单元测试的讨论特别多&#xff0c;但真正系统、能落地的指南却很少。很多开发者&#xff0c;尤其是刚接触AI Agent框架的朋友&#xff0c;一上来…

作者头像 李华