原标题:在Linux进行IO的正确姿势

很多C/C++程序虽然在做网络编程, 但大多用别人封装好的库, 对底层不甚了解, 感觉 IO 操作不是很简单吗? 我敢说, 大多数人进行 IO 的姿势都不对, 所谓的 IO, 主要是 read()/write() 两个函数.

先说错误的 IO 读操作:

int ret = read(fd, buf, len); if(ret == -1){ exit(-1); }else if(ret == 0){ close(fd); }

看起来好像很正确的样子, 返回值也判断了, 不仅判断 -1, 还判断 0, 应该姿势正确吧? 错! 完全错误! 因为你忽略了 errno 的处理. 仔细看文档, 函数返回 -1 不能完全代表 fd 错误, 还需要结合 errno.

接下来这样改:

int ret = read(fd, buf, len); if(ret == -1){ if(errno == EINTR){ // 怎么办? }else if(errno == EAGAIN){ // 怎么办? } exit(-1); }else if(ret == 0){ close(fd); }

EINTR 表示 read() 函数调用被系统中断了, 调用者和 fd 都没有问题, 有问题的是操作系统. 而 EAGAIN 是在非阻塞 IO 时会出现. 上面的代码判断了 errno, 但不知道下一步该怎么做, 还不行.

在 Linux 下进行 IO 操作的正确姿势是:

while(1){ int ret = read(fd, buf, len); if(ret == -1){ if(errno == EINTR){ continue; }else if(errno == EAGAIN){ // 根据你和调用者的约定, 返回一个数值告诉它再次重试 // 一般是结合 select/epoll 等 IO 多路复用函数 } exit(-1); }else if(ret == 0){ close(fd); } }

没错, 在 read() 外面包一个 while(0). 以后你看到有谁写的 read() 代码不是被包含在一个死循环里, 你就可以下结论说这段代码不完善.

写 IO 的 write() 函数也是类似用法. 建议有心人可以参考 sim 框架的代码, 看看别人是怎么做的, 程序员应该多造轮子, 但不要关起门来造车.返回搜狐,查看更多

责任编辑:

io在Linux,在Linux进行IO的正确姿势相关推荐

  1. Linux中查看日志文件的正确姿势,求你别tail走天下了!

    作为一个后端开发工程师,在Linux中查看查看文件内容是基本操作了.尤其是通常要分析日志文件排查问题,那么我们应该如何正确打开日志文件呢?对于我这种小菜鸡来说,第一反应就是 cat,tail,vi(或 ...

  2. linux view查看日志命令,【Linux】linux查看日志文件内容命令tail、cat、tac、head、echo...

    linux查看日志文件内容命令tail.cat.tac.head.echo tail -f test.log 你会看到屏幕不断有内容被打印出来. 这时候中断第一个进程Ctrl-C, --------- ...

  3. cacti监控linux和windows磁盘IO

    cacti监控linux和windows磁盘IO 标签:cacti linux磁盘IO windows磁盘IO 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则 ...

  4. linux块设备的IO调度算法和回写机制

    ************************************************************************************** 參考: <Linux ...

  5. 如何提高Linux下块设备IO的整体性能?

    编辑手记:本文主要讲解Linux IO调度层的三种模式:cfp.deadline和noop,并给出各自的优化和适用场景建议. 作者简介: 邹立巍 Linux系统技术专家.目前在腾讯SNG社交网络运营部 ...

  6. Linux驱动程序开发 - 设备IO

    序言: 前面我们提到,设备驱动程序的主要功能操作设备,更准确的说就是如何操作设备寄存器或设备内存.不同的计算机体系结构提供了不同的设备操作接口,主要就是IO端口映射(Ports)或IO内存映射(Mem ...

  7. 【Linux系统编程】IO标准缓冲区

    00. 目录 文章目录 00. 目录 01. 缓冲区概述 02. 全缓冲 03. 行缓冲 04. 不带缓冲区 05. 附录 01. 缓冲区概述 标准I/O提供了三种类型的缓冲: 1.全缓冲: 在填满标 ...

  8. Linux中的基础IO(二)

    Linux中的基础IO(二) 文章目录 Linux中的基础IO(二) 一.基本接口 二.文件描述符 三.文件描述符的分配规则 四.重定向 五.dup2系统调用 六.minishell 一.基本接口 i ...

  9. Linux中的基础IO(一)

    Linux中的基础IO 文章目录 Linux中的基础IO 一.C语言中的文件接口 二.随机读写数据文件 三.文件读写的出错检测 一.C语言中的文件接口 写在前面 计算机文件是以计算机硬盘为载体存储在计 ...

最新文章

  1. OPhone2.0应该重在中文应用体验
  2. springBoot中启用事务管理
  3. java中垃圾收集_Java中的垃圾收集器是什么?
  4. 向ASP.NET Core迁移
  5. 考研复试考java_2019考研复试经验帖:过来人谈5件“小事”
  6. SQL Server MDS(主数据服务)介绍
  7. flask异步操作_从Flask到FastAPI的平滑迁移
  8. 手机按三角返回页面上一页_小猿圈微信小程序跳转页面都有哪些?
  9. JXL读取,写入Excel
  10. codeforces629C Famil Door and Brackets (dp)
  11. latex 模板使用
  12. 第九届蓝桥杯b组java
  13. 4针串口线接法图_9针rs232串口接线图以及接线方法
  14. 为什么好多人说win8不好用?
  15. 我的编程之路点滴记录(二)
  16. 代码随想录第二天 leetcode 977、209、59
  17. vmware不支持linux,vmware不支持opengl
  18. UIQ 3 概念认识
  19. (附源码)php遵义旅游管理系统 毕业设计091801
  20. 语法基础(判断语句)

热门文章

  1. java 引用传递_详解java的值传递、地址传递、引用传递
  2. 腾讯云 cloudbase 云开发使用笔记
  3. 生信分析-TBtools绘制热图
  4. ​北京大学吴华君组诚聘医学/生信助理研究员和博士后
  5. EJSS: 南土所梁玉婷组-生境决定了土壤植物系统中细菌、抗性基因和可移动元件间的关系...
  6. Microbiome:韦中组揭示根际原生动物群落是决定植物健康的关键因素
  7. 创建属于自己的调色板
  8. python使用matplotlib可视化、使用matplotlib可视化scipy.misc图像、自定义使用winter色彩映射、将不同亮度映射到不同的色彩
  9. R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置x轴的标签文本使用粗体字体)
  10. R语言使用car包的influencePlot函数将回归分析中的离群点(outlier)、杠杆(leverage)和影响(influence)的信息组合成一个高度信息量丰富的合成图