我是靠谱客的博主 平淡刺猬,最近开发中收集的这篇文章主要介绍Linux 文件IO之操作缓存,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在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缓冲流程(针对写):

  1. 通过标准库将用户数据传递到用户空间缓冲区;
  2. 当缓冲区填满时,stdio库会调用write()系统调用,将数据传递到内核高速缓存区;
  3. 内核发起磁盘操作,将数据写到磁盘。

标准C库的fread、fwrite操作其实还是调用的系统IO函数read、write。

还提供了几种方式来控制缓冲:

  • fflush:刷新stdio缓冲区,即通过write刷新到内核缓冲区
  • fsync:系统调用,将缓冲数据和文件描述符的所有元数据都刷新到磁盘

在设计应用程序时应该考虑,最好在文件写完后刷新缓冲,保证文件在磁盘上写完整。

一种应用是在持续写文件中系统突然断电的文件保存,这时候最好在每秒的数据写入后刷新同步下。

最后

以上就是平淡刺猬为你收集整理的Linux 文件IO之操作缓存的全部内容,希望文章能够帮你解决Linux 文件IO之操作缓存所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部