【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不行? 展开
这段代码执行完后,内核缓存还来不及写入硬盘,文件就被删除了,如何可以观察到缓存是否完全写入硬盘,做到同步?
linux下c语言似乎有个fsync函数可以,但windows不行? 展开
5个回答
展开全部
我有点疑惑,fp你确定成功打开了文件?
fclose(fp);就清理了所有缓存,并且确保把缓存写入了文件,而且还是线程互斥的。
你可以fclose后立即打开文件,再读取文件内容确认一下,如果写入成功,那就该是写入的内容。
你fclose后再删除文件,然后去360文件恢复找,不知道是否找到的就是刚刚删除的那个。
fclose(fp);就清理了所有缓存,并且确保把缓存写入了文件,而且还是线程互斥的。
你可以fclose后立即打开文件,再读取文件内容确认一下,如果写入成功,那就该是写入的内容。
你fclose后再删除文件,然后去360文件恢复找,不知道是否找到的就是刚刚删除的那个。
追问
打开了,fclose确实是缓存写入文件,但是我认为系统在写完缓存之前先删除了文件,因为cpu执行速度比写入快多了,在完全写入之前直接执行remove,cpu不等缓存写入完。360找的肯定对,名字一样内容也和覆盖前一样。
另外fclose立即打开一直是一样的,我怀疑打开后系统自动从I/O缓存中返回写入的数据,这只是一个猜想。
追答
那要不再试试,不remove,而是copyfile。我没仔细研究过fclose,但是从MSDN文档看到的信息可以知道它释放了所有缓存,所以不存在你再次打开又返回之前的缓存,你可以对比一下两次fopen的fp的值。
看了你其它追问,你下断点测试的时候,是断点处,直接去看文件,还是断点处停顿,过一会再继续执行,删除了文件后,360去找?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
使用fflush函数,将数据直接从缓冲区写入硬盘。
函数原型:int fflush( FILE *stream );
这样,就可以下断点调试了。
函数原型:int fflush( FILE *stream );
这样,就可以下断点调试了。
追问
用fflush不行。而且下断点就肯定可以了,因为在执行remove之前系统有足够的时间把缓存写入硬盘了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
改用open/close, write/ read吧,这样内核不会缓存文件内容。
使用fopen/fclose, fwrite/fread的目的是为了减少IO次数, 提高系统性能。
使用fopen/fclose, fwrite/fread的目的是为了减少IO次数, 提高系统性能。
追问
是说write写完后cpu才会再继续向下执行吗?如果是可以的话,要什么头文件?我记得这是linux下c语言才有,windows行吗?
追答
windows下的C库:
_open/_close, _write/_read
使用 _write,数据不会缓存,操作系统会尽快将数据写出去。
使用 fwrite,数据会缓存,操作系统会尽量慢地将数据写出去。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
关闭文件之前,调用fflush(fp);
追问
还是不行,remove直接删除文件,缓存还是来不及写,而且fclose不就等于会fflush吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不写完是不会继续往下执行的,这个不是异步的,fclose就是刷新缓冲区并关闭句柄,和fflush一样,都是将缓冲区的内容写入文件
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询