open和fopen无缓冲IO与有缓冲IO

在UNIX系统中,open和fopen系统调用都用于打开文件,但他们的缓冲机制不同。
open系统调用是一种底层的系统调用,用于打开文件并返回一个文件描述符。它不涉及任何缓冲机制,所以是无缓冲IO。
fopen是一个更高层的函数,它是基于标准C库实现的,提供了更丰富的文件操作函数。fopen函数打开一个文件,并返回一个FILE指针。
FILE指针是一个抽象数据类型,封装了底层的文件描述符以及一些缓冲区信息。fopen函数提供了缓冲机制,这是因为标准C库会为每一
个FILE对象分配一个缓冲区,并在需要时将缓冲区的信息写入磁盘。所以fopen函数是又缓冲IO.
需要注意的是,无缓冲IO和有缓冲IO所指的是数据在内存和外部设备之间传输时是否使用缓冲机制,而不是在哪个层次上使用缓冲机制。
在底层系统调用中,操作系统内核会直接将数据从内存复制到外部设备中,不会使用任何缓冲机制,所以是无缓冲IO.而在C标准库中,使
用了缓冲区来缓存数据,所以是有缓冲IO.

缓冲从区别上来看可以简单看作是用户态文件缓冲区/文件流/FILE
对于磁盘文件的读写只有内核态空间才有操作权限(内存分为内核态空间和用户态空间),open就是创建一个文件对象,
分配一个文件描述符。这个文件对象在内核态空间,即对应了一个磁盘文件,我们通过文件描述符对其操作,即完成了对
磁盘文件的读写。文件描述符类似于一个指针,指向了你要操作的文件对象。

在Linux下,文件系统通常采用延迟写入(delayed write)策略,即将数据缓存在内存中,并不立即写入磁盘,
而是等待一段时间或者达到一定的条件后再写入磁盘。因此,即使在使用缓冲IO写入数据后调用了flush()函数,
也不能保证数据已经真正写入了磁盘。但是在调用close()函数关闭文件描述符时,文件系统会强制将数据写入磁盘。

posted @   慢慢混日子  阅读(250)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示