免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5462 | 回复: 5
打印 上一主题 下一主题

[Linux] 能否让write函数写入的内容,直到fsync才真的写入磁盘呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-05 15:06 |只看该作者 |倒序浏览
20可用积分
本帖最后由 ejeker 于 2013-07-07 12:33 编辑

linux的系统调用write/read在用户级是没有缓存的(不像stdio那样有buffer),而在内核级是有缓存的,对吧?
但是我写了一个小程序,来测试write操作是不是立刻写入磁盘,用RHEL6.3编译运行,如下:

  1. #include<fcntl.h>
  2. #include<sys/types.h>
  3. int main()
  4. {
  5.     int fd=open("/tmp/test1",O_CREAT|O_RDWR);
  6.     if(fd<0)exit(1);
  7.     write(fd,"you",3 );
  8.     sleep(100);
  9.     close(fd);
  10.     return 0;
  11. }
复制代码
程序运行到sleep(100)的时候,我立刻在另一个终端里面cat /tmp/test1就能发现我写入的内容。并没有等到close函数执行,内容就已经写入了文件。
(1) 我删掉这个文件,重来,一样的结果,文件显示you。
(2) 我把you改成him,重来,一样的结果,文件显示him。

这让我感觉很矛盾:
(a)看起来在内核层面,write也是没有缓存的啊,不需要任何flush操作就真的写入了。
(b)那么,如果linux实现的write/read是无缓存的,那么fsync函数还有什么存在的意义呢?

a和b这两点互相矛盾啊!
还请大侠解释一下我的疑惑!

最佳答案

查看完整内容

回复 1# ejeker 这测试靠谱吗?你看看apue 3.14节测试用的方法吧

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
2 [报告]
发表于 2013-07-05 15:06 |只看该作者
回复 1# ejeker
这测试靠谱吗?
你看看apue 3.14节测试用的方法吧


   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2013-07-05 22:39 |只看该作者
你读也是通过系统调用的,不能保证读到的真的是从磁盘而不是缓存读取的。

调用fsync也不能保证真的已经写到磁盘了

论坛徽章:
0
4 [报告]
发表于 2013-07-06 15:40 |只看该作者
APUE上说在没有设置O_SYNC同步写的write操作只是把写入磁盘的数据排入写队列就返回了,数据会在以后的某个时间将队列中的数据写入磁盘,而你的代码sleep(100)这个时间可能远大于在队列中等待写入磁盘的时间,即你检查的时候已经执行了写磁盘的操作,所以你看上去write调用返回后就已近写了,实际上在没有设置O_SYNC的情况下write系统调用和写入磁盘的操作是异步执行了,但是你的检查方法不能精确控制在这个异步操作相隔的时间段内去检查。所以结果反映出来的是矛盾的。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
5 [报告]
发表于 2013-07-06 19:11 |只看该作者

论坛徽章:
0
6 [报告]
发表于 2013-07-07 12:33 |只看该作者


也就是页高速缓存和页回写机制。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP