io在Linux,在Linux进行IO的正确姿势
原标题:在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的正确姿势相关推荐
- Linux中查看日志文件的正确姿势,求你别tail走天下了!
作为一个后端开发工程师,在Linux中查看查看文件内容是基本操作了.尤其是通常要分析日志文件排查问题,那么我们应该如何正确打开日志文件呢?对于我这种小菜鸡来说,第一反应就是 cat,tail,vi(或 ...
- linux view查看日志命令,【Linux】linux查看日志文件内容命令tail、cat、tac、head、echo...
linux查看日志文件内容命令tail.cat.tac.head.echo tail -f test.log 你会看到屏幕不断有内容被打印出来. 这时候中断第一个进程Ctrl-C, --------- ...
- cacti监控linux和windows磁盘IO
cacti监控linux和windows磁盘IO 标签:cacti linux磁盘IO windows磁盘IO 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则 ...
- linux块设备的IO调度算法和回写机制
************************************************************************************** 參考: <Linux ...
- 如何提高Linux下块设备IO的整体性能?
编辑手记:本文主要讲解Linux IO调度层的三种模式:cfp.deadline和noop,并给出各自的优化和适用场景建议. 作者简介: 邹立巍 Linux系统技术专家.目前在腾讯SNG社交网络运营部 ...
- Linux驱动程序开发 - 设备IO
序言: 前面我们提到,设备驱动程序的主要功能操作设备,更准确的说就是如何操作设备寄存器或设备内存.不同的计算机体系结构提供了不同的设备操作接口,主要就是IO端口映射(Ports)或IO内存映射(Mem ...
- 【Linux系统编程】IO标准缓冲区
00. 目录 文章目录 00. 目录 01. 缓冲区概述 02. 全缓冲 03. 行缓冲 04. 不带缓冲区 05. 附录 01. 缓冲区概述 标准I/O提供了三种类型的缓冲: 1.全缓冲: 在填满标 ...
- Linux中的基础IO(二)
Linux中的基础IO(二) 文章目录 Linux中的基础IO(二) 一.基本接口 二.文件描述符 三.文件描述符的分配规则 四.重定向 五.dup2系统调用 六.minishell 一.基本接口 i ...
- Linux中的基础IO(一)
Linux中的基础IO 文章目录 Linux中的基础IO 一.C语言中的文件接口 二.随机读写数据文件 三.文件读写的出错检测 一.C语言中的文件接口 写在前面 计算机文件是以计算机硬盘为载体存储在计 ...
最新文章
- OPhone2.0应该重在中文应用体验
- springBoot中启用事务管理
- java中垃圾收集_Java中的垃圾收集器是什么?
- 向ASP.NET Core迁移
- 考研复试考java_2019考研复试经验帖:过来人谈5件“小事”
- SQL Server MDS(主数据服务)介绍
- flask异步操作_从Flask到FastAPI的平滑迁移
- 手机按三角返回页面上一页_小猿圈微信小程序跳转页面都有哪些?
- JXL读取,写入Excel
- codeforces629C Famil Door and Brackets (dp)
- latex 模板使用
- 第九届蓝桥杯b组java
- 4针串口线接法图_9针rs232串口接线图以及接线方法
- 为什么好多人说win8不好用?
- 我的编程之路点滴记录(二)
- 代码随想录第二天 leetcode 977、209、59
- vmware不支持linux,vmware不支持opengl
- UIQ 3 概念认识
- (附源码)php遵义旅游管理系统 毕业设计091801
- 语法基础(判断语句)
热门文章
- java 引用传递_详解java的值传递、地址传递、引用传递
- 腾讯云 cloudbase 云开发使用笔记
- 生信分析-TBtools绘制热图
- ​北京大学吴华君组诚聘医学/生信助理研究员和博士后
- EJSS: 南土所梁玉婷组-生境决定了土壤植物系统中细菌、抗性基因和可移动元件间的关系...
- Microbiome:韦中组揭示根际原生动物群落是决定植物健康的关键因素
- 创建属于自己的调色板
- python使用matplotlib可视化、使用matplotlib可视化scipy.misc图像、自定义使用winter色彩映射、将不同亮度映射到不同的色彩
- R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置x轴的标签文本使用粗体字体)
- R语言使用car包的influencePlot函数将回归分析中的离群点(outlier)、杠杆(leverage)和影响(influence)的信息组合成一个高度信息量丰富的合成图