coding--open、fopen的差别

本文深入探讨了系统调用open与C函数fopen在文件操作中的应用区别,解释了两者如何实现无缓冲与带缓冲的io,并通过实例展示了两者在文件操作过程中的表现差异。重点阐述了标准库中的带缓存文件操作是如何通过自动分配内存与读取固定大小内容来提升效率,以及不带缓存的文件操作如何直接与系统调用交互,虽然速度可能不如带缓存操作,但在某些场景下仍具有不可忽视的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

open是系统调用,对应无缓冲的io;fopen是C函数,对应缓冲的io,fopen会调用open实现。

程序中用openwrite打开创建并把“hello world“写入文件test.txt,相应用fopenfwrite操作文件test2.txt

程序执行到openfopen之后,sleep 15秒,这时用ls查看生成了文件没,这时用open打开的test.txt出现了,但是fopentest2.txt没有;

当程序执行完writefwrite之后,fopentest2.txt仍然没有出现(还是用ls查看),再用cattest.txt,可以看到 “helloworld”

最后再关闭test.txttest2.txt,这时test2.txt出现了,并且其内容也是“hello world”。

 

带缓存的文件操作是标准C库的实现,第一次调用带缓存的文件操作函数时标准库会自动分配内存并且读出一段固定大小的内容存储在缓存中。以后每次的读写操作并不是针对硬盘上的文件直接进行的,而是针对内存中的缓存的。何时从硬盘中读取文件或者向硬盘中写入文件有标准库的机制控制。不带缓存的文件操作通常都是系统提供的系统调用,更加低级,直接从硬盘中读取和写入文件,由于IO瓶颈的原因,速度并不如意,而且原子操作需要程序员自己保证,但使用得当的话效率并不差。另外标准库中的带缓存文件IO 是调用系统提供的不带缓存IO实现的。

“术语不带缓冲指的是每个read和write都调用内核中的一个系统调用。所有的磁盘I/O都要经过内核的块缓冲(也称内核的缓冲区高速缓存),唯一例外的是对原始磁盘设备的I/O。既然read或write的数据都要被内核缓冲,那么术语“不带缓冲的I/O“指的是在用户的进程中对这两个函数不会自动缓冲,每次read或write就要进行一次系统调用。“

--------摘自<unix环境编程>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值