【c语言】关于内核缓存写入文件问题 120

.......fwrite(fp,1,1000000,c);//c是一个指向1百万空间内存的指针fclose(fp);//关闭文件remove(fp_dizhi);//删... .......fwrite(fp,1,1000000,c);//c是一个指向1百万空间内存的指针fclose(fp);//关闭文件remove(fp_dizhi);//删除文件,fp_dizhi是该文件地址
这段代码执行完后,内核缓存还来不及写入硬盘,文件就被删除了,如何可以观察到缓存是否完全写入硬盘,做到同步?

linux下c语言似乎有个fsync函数可以,但windows不行?
展开
 我来答
龚炜林
2014-05-13 · TA获得超过1560个赞
知道大有可为答主
回答量:1102
采纳率:66%
帮助的人:558万
展开全部
我有点疑惑,fp你确定成功打开了文件?
fclose(fp);就清理了所有缓存,并且确保把缓存写入了文件,而且还是线程互斥的。
你可以fclose后立即打开文件,再读取文件内容确认一下,如果写入成功,那就该是写入的内容。
你fclose后再删除文件,然后去360文件恢复找,不知道是否找到的就是刚刚删除的那个。
追问
打开了,fclose确实是缓存写入文件,但是我认为系统在写完缓存之前先删除了文件,因为cpu执行速度比写入快多了,在完全写入之前直接执行remove,cpu不等缓存写入完。360找的肯定对,名字一样内容也和覆盖前一样。
另外fclose立即打开一直是一样的,我怀疑打开后系统自动从I/O缓存中返回写入的数据,这只是一个猜想。
追答
那要不再试试,不remove,而是copyfile。我没仔细研究过fclose,但是从MSDN文档看到的信息可以知道它释放了所有缓存,所以不存在你再次打开又返回之前的缓存,你可以对比一下两次fopen的fp的值。
看了你其它追问,你下断点测试的时候,是断点处,直接去看文件,还是断点处停顿,过一会再继续执行,删除了文件后,360去找?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2014-05-13 · TA获得超过154个赞
知道小有建树答主
回答量:92
采纳率:0%
帮助的人:94.4万
展开全部
使用fflush函数,将数据直接从缓冲区写入硬盘。
函数原型:int fflush( FILE *stream );
这样,就可以下断点调试了。
追问
用fflush不行。而且下断点就肯定可以了,因为在执行remove之前系统有足够的时间把缓存写入硬盘了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
巴代秋9P
2014-05-13 · 超过19用户采纳过TA的回答
知道答主
回答量:50
采纳率:0%
帮助的人:39.3万
展开全部
改用open/close, write/ read吧,这样内核不会缓存文件内容。
使用fopen/fclose, fwrite/fread的目的是为了减少IO次数, 提高系统性能。
追问
是说write写完后cpu才会再继续向下执行吗?如果是可以的话,要什么头文件?我记得这是linux下c语言才有,windows行吗?
追答
windows下的C库:
_open/_close, _write/_read

使用 _write,数据不会缓存,操作系统会尽快将数据写出去。
使用 fwrite,数据会缓存,操作系统会尽量慢地将数据写出去。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wuzongxian0010
2014-05-13 · TA获得超过796个赞
知道小有建树答主
回答量:433
采纳率:100%
帮助的人:327万
展开全部
关闭文件之前,调用fflush(fp);
追问
还是不行,remove直接删除文件,缓存还是来不及写,而且fclose不就等于会fflush吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
释迦摩尼1989
2014-05-14
知道答主
回答量:2
采纳率:0%
帮助的人:2677
展开全部
不写完是不会继续往下执行的,这个不是异步的,fclose就是刷新缓冲区并关闭句柄,和fflush一样,都是将缓冲区的内容写入文件
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式