在 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相关推荐

  1. [XMOVE自主设计的体感方案] XMove Studio管理系统(二)应用开发API简要介绍

    一. XMove的开放式应用开发框架简介 XMove4.0以开放式的结构满足扩展性的要求.所有无线协议,底层算法和控制逻辑全部上移到PC端.节点只根据接受的控制逻辑返回传感器数据.新的架构使得开发新应 ...

  2. C++文件操作API函数介绍

    转自 http://www.studentblog.net/m/tonycat/archives/2006/26364.html 文件的基本概念 所谓"文件"是指一组相关数据的有序 ...

  3. P6专题:P6模块/组件简要介绍(P6,Professional,API,TeamMember,WebService)

    目录 一 引言 二 P6组件 P6 P6 Professional Team Member PC Team Member App Integration API WebService 一 引言 Ora ...

  4. Hadoop学习笔记一 简要介绍

    Hadoop学习笔记一 简要介绍 这里先大致介绍一下Hadoop.     本文大部分内容都是从官网Hadoop上来的.其中有一篇介绍HDFS的pdf文档,里面对Hadoop介绍的比较全面了.我的这一 ...

  5. RT-Thread Pin设备驱动API应用介绍

    概要 本文主要涉及Pin驱动相关的API接口的简要介绍及使用示例,有兴趣深入了解Pin驱动程序框架可参考:RT-Thread pin设备驱动代码结构剖析 PIN设备的操作方法 应用程序通过RT-Thr ...

  6. openstack及组件简要介绍

    openstack及组件简要介绍 为什要用云? 一.简单的说就是对资源更加合理的分配,使用,比如硬件的数量,带宽等等这些,因为你不能机器买来不需要了再卖掉(当然也可以),带宽跟机房签合同得来一年的,中 ...

  7. 简要介绍BASE64、MD5、SHA、HMAC几种方法。

    加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了.     言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     ...

  8. 图形化界面设计软件简要介绍

    图形化界面设计软件简要介绍 [摘要]:面向使用者的系统工程设计,其目的是要准确.快速地在设计者和使用者之间传递信息和实现功能,也是优化产品性能来适应大众的操作能力,减轻使用者的认知负担.成功的系统工程 ...

  9. RobotFramework入门(一)简要介绍及使用

    前言 本章主要讲述Robotframework的简要介绍及使用 一.简要介绍 Robotframework:是一个基于Python语言开发的,可扩展的,是关键字驱动模式的自动化测试框架,Robotfr ...

最新文章

  1. 深度学习tensorflow框架的会话
  2. 牛客--二维数组中的查找
  3. Netty基于ip的黑名单过滤——RuleBasedIpFilter
  4. 【Struts】:Struts1和Struts2的区别与联系
  5. [maven] Maven面试宝典
  6. Nature报道诺奖得主:给研究生的四条箴言 Four golden lessons。颜宁:写的真好!
  7. 局域网资产发现过程(利用工具nmap、masscan)
  8. 光猫+路由器如何映射端口
  9. 渗透测试-CTF_AWD专题篇
  10. Exposed Acne Treatment Review
  11. 闲鱼是如何实践一套完整的埋点自动化验证方案的?
  12. 4 NLP之数据平滑技术
  13. 解决ORA-28000:the account is locked,解锁oracle用户
  14. mysql余额统计_实现按部门月卡余额总额分组统计的SQL查_mysql
  15. 高中计算机学业水平测试题目,2016年高中学业水平考试信息技术学科模拟题一(带答案)...
  16. NixOS 安装教程
  17. 微信即刻视频下载器插件开发过程原理详解
  18. Qt编写物联网管理平台49-设备模拟工具
  19. 数据分析-可视化数据分析
  20. Keeping Your Modules Compatible 保持模块兼容性

热门文章

  1. 使用天地图报错Error in v-on handler: “TypeError: Cannot read property ‘_tdt_events‘ of null
  2. Linux下修改图片格式和大小
  3. Vue3 vscode开发新extension:使用 volar 代替 vetur
  4. Vetur can‘t find`package.json`in路径 和 Vetur can‘t find`tsconfig.json`or`jsconfig.json`in路径 VSCode弹框
  5. java 网上商城系统_基于Java_web开发的网上商城系统(含源文件).doc
  6. Unity中实现苹果手机的Taptic震动
  7. 苹果手机死机,无法强制重启
  8. uiautomator2+mitmproxy+weditor+Python3抖音数据抓取
  9. 御方宝贝—天然有方 快乐成长
  10. 二叉树(类模板、函数模板、函数对象、函数指针)