文件 I/O API 简要介绍:read, pread 和 readv, preadv
在 linux 平台,如果想从文件描述符中读取数据,主要通过以下 API 实现,当然还有其他 API。
ssize_t read(int fd, void *buf, size_t nbyte);
ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset);ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);
read 会从 fd 当前的 offset 处开始读,读取完 nbyte 后,该 fd 的 offset 会增加 nbyte(假设可以读取到 nbyte),下一次 read 则从新的 offset 处开始读。
而 pread 则是从指定的 offset 处开始读,这个 offset 是相对于 0 的一个绝对值,与 fd 当前的 offset 没有关系。
打开一个文件时,offset 默认为 0;如果打开时指定了 O_APPEND 选项,那么 offset 为 SEEK_END 即文件末尾。
read 和 pread 的区别就是,read 会改变 fd 的 offset,而 pread 不会改变。
pread 的实际操作类似于 lseek + read,即先将 offset 调整到指定值,再调用 read 读取数据,两者的区别在于 pread 是一个原子操作,从而可以保证一定是从指定的 offset 处开始读;另外就是 pread 读取完数据会恢复执行之前的 offset,即 pread 操作前后的 offset 是一致的。
readv 则是从 fd 中读取数据到多个 buf,buf 数为 iovcnt,每个 buf 有自己的长度(可以一样),一个 buf 写满(写指读出数据并保存),才接着写下一个 buf,依次类推。preadv 与 readv 的关系,与上述 read 和 pread 的关系一样。
除了文件 I/O,还有网络 I/O,read/write 也可用于网络 I/O,只用于网络 I/O 的 API 有:
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
read、write 和 recv、send 在网络 I/O 上并无本质区别,只是在参数上面有细微差别。
接下来的问题是,各个 API 的使用场景,后续完善。
文件 I/O API 简要介绍:read, pread 和 readv, preadv相关推荐
- [XMOVE自主设计的体感方案] XMove Studio管理系统(二)应用开发API简要介绍
一. XMove的开放式应用开发框架简介 XMove4.0以开放式的结构满足扩展性的要求.所有无线协议,底层算法和控制逻辑全部上移到PC端.节点只根据接受的控制逻辑返回传感器数据.新的架构使得开发新应 ...
- C++文件操作API函数介绍
转自 http://www.studentblog.net/m/tonycat/archives/2006/26364.html 文件的基本概念 所谓"文件"是指一组相关数据的有序 ...
- P6专题:P6模块/组件简要介绍(P6,Professional,API,TeamMember,WebService)
目录 一 引言 二 P6组件 P6 P6 Professional Team Member PC Team Member App Integration API WebService 一 引言 Ora ...
- Hadoop学习笔记一 简要介绍
Hadoop学习笔记一 简要介绍 这里先大致介绍一下Hadoop. 本文大部分内容都是从官网Hadoop上来的.其中有一篇介绍HDFS的pdf文档,里面对Hadoop介绍的比较全面了.我的这一 ...
- RT-Thread Pin设备驱动API应用介绍
概要 本文主要涉及Pin驱动相关的API接口的简要介绍及使用示例,有兴趣深入了解Pin驱动程序框架可参考:RT-Thread pin设备驱动代码结构剖析 PIN设备的操作方法 应用程序通过RT-Thr ...
- openstack及组件简要介绍
openstack及组件简要介绍 为什要用云? 一.简单的说就是对资源更加合理的分配,使用,比如硬件的数量,带宽等等这些,因为你不能机器买来不需要了再卖掉(当然也可以),带宽跟机房签合同得来一年的,中 ...
- 简要介绍BASE64、MD5、SHA、HMAC几种方法。
加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了. 言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书. ...
- 图形化界面设计软件简要介绍
图形化界面设计软件简要介绍 [摘要]:面向使用者的系统工程设计,其目的是要准确.快速地在设计者和使用者之间传递信息和实现功能,也是优化产品性能来适应大众的操作能力,减轻使用者的认知负担.成功的系统工程 ...
- RobotFramework入门(一)简要介绍及使用
前言 本章主要讲述Robotframework的简要介绍及使用 一.简要介绍 Robotframework:是一个基于Python语言开发的,可扩展的,是关键字驱动模式的自动化测试框架,Robotfr ...
最新文章
- 深度学习tensorflow框架的会话
- 牛客--二维数组中的查找
- Netty基于ip的黑名单过滤——RuleBasedIpFilter
- 【Struts】:Struts1和Struts2的区别与联系
- [maven] Maven面试宝典
- Nature报道诺奖得主:给研究生的四条箴言 Four golden lessons。颜宁:写的真好!
- 局域网资产发现过程(利用工具nmap、masscan)
- 光猫+路由器如何映射端口
- 渗透测试-CTF_AWD专题篇
- Exposed Acne Treatment Review
- 闲鱼是如何实践一套完整的埋点自动化验证方案的?
- 4 NLP之数据平滑技术
- 解决ORA-28000:the account is locked,解锁oracle用户
- mysql余额统计_实现按部门月卡余额总额分组统计的SQL查_mysql
- 高中计算机学业水平测试题目,2016年高中学业水平考试信息技术学科模拟题一(带答案)...
- NixOS 安装教程
- 微信即刻视频下载器插件开发过程原理详解
- Qt编写物联网管理平台49-设备模拟工具
- 数据分析-可视化数据分析
- Keeping Your Modules Compatible 保持模块兼容性
热门文章
- 使用天地图报错Error in v-on handler: “TypeError: Cannot read property ‘_tdt_events‘ of null
- Linux下修改图片格式和大小
- Vue3 vscode开发新extension:使用 volar 代替 vetur
- Vetur can‘t find`package.json`in路径 和 Vetur can‘t find`tsconfig.json`or`jsconfig.json`in路径 VSCode弹框
- java 网上商城系统_基于Java_web开发的网上商城系统(含源文件).doc
- Unity中实现苹果手机的Taptic震动
- 苹果手机死机,无法强制重启
- uiautomator2+mitmproxy+weditor+Python3抖音数据抓取
- 御方宝贝—天然有方 快乐成长
- 二叉树(类模板、函数模板、函数对象、函数指针)