概述
在Linux世界里,一切皆文件。这其实体现了Linux的深刻设计思想。这里归纳下Linux的文件IO。
Linux中所有的IO操作的系统调用都是文件描述符。
文件描述符表示已打开的文件,包含:
- 管道(用于进程间通信,包括无名管道pipe和有名管道FIFO)
- 套接字socket(多用于网络编程)
- 终端
- 设备(所有的外设硬件通过驱动映射为了文件)
- 普通文件
所有的系统调用都是以原子操作方式执行的,执行文件IO操作的主要系统调用:
- open()
- read()
- write()
- close()
- lseek()改变文件偏移量,当然读和写都会隐式的改变这个偏移量
- ioctl()这玩意在驱动中是不是到处都是
出于速度和效率考虑,系统IO调用和标准C库(stdio)在操作磁盘文件时会对数据进行缓冲,即用户空间缓冲区与内核缓冲区高速缓存直接传输数据。
在应用编程中常使用的是标准C库,stdio提供了fread、fwrite等函数,实现对IO自动的缓冲管理。这时候对应的就是文件流了。
IO缓冲流程(针对写):
- 通过标准库将用户数据传递到用户空间缓冲区;
- 当缓冲区填满时,stdio库会调用write()系统调用,将数据传递到内核高速缓存区;
- 内核发起磁盘操作,将数据写到磁盘。
标准C库的fread、fwrite操作其实还是调用的系统IO函数read、write。
还提供了几种方式来控制缓冲:
- fflush:刷新stdio缓冲区,即通过write刷新到内核缓冲区
- fsync:系统调用,将缓冲数据和文件描述符的所有元数据都刷新到磁盘
在设计应用程序时应该考虑,最好在文件写完后刷新缓冲,保证文件在磁盘上写完整。
一种应用是在持续写文件中系统突然断电的文件保存,这时候最好在每秒的数据写入后刷新同步下。
最后
以上就是平淡刺猬为你收集整理的Linux 文件IO之操作缓存的全部内容,希望文章能够帮你解决Linux 文件IO之操作缓存所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复