ejeker 发表于 2013-07-05 15:06

能否让write函数写入的内容,直到fsync才真的写入磁盘呢?

本帖最后由 ejeker 于 2013-07-07 12:33 编辑

linux的系统调用write/read在用户级是没有缓存的(不像stdio那样有buffer),而在内核级是有缓存的,对吧?
但是我写了一个小程序,来测试write操作是不是立刻写入磁盘,用RHEL6.3编译运行,如下:
#include<fcntl.h>
#include<sys/types.h>
int main()
{
    int fd=open("/tmp/test1",O_CREAT|O_RDWR);
    if(fd<0)exit(1);
    write(fd,"you",3 );
    sleep(100);
    close(fd);
    return 0;
}
程序运行到sleep(100)的时候,我立刻在另一个终端里面cat /tmp/test1就能发现我写入的内容。并没有等到close函数执行,内容就已经写入了文件。
(1) 我删掉这个文件,重来,一样的结果,文件显示you。
(2) 我把you改成him,重来,一样的结果,文件显示him。

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

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

井蛙夏虫 发表于 2013-07-05 15:06

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


   

hellioncu 发表于 2013-07-05 22:39

你读也是通过系统调用的,不能保证读到的真的是从磁盘而不是缓存读取的。

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

littleboyrufeng 发表于 2013-07-06 15:40

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

linux_c_py_php 发表于 2013-07-06 19:11

http://www.cnblogs.com/hanyan225/archive/2011/08/05/2126619.html

ejeker 发表于 2013-07-07 12:33

linux_c_py_php 发表于 2013-07-06 19:11 static/image/common/back.gif
http://www.cnblogs.com/hanyan225/archive/2011/08/05/2126619.html

也就是页高速缓存和页回写机制。
页: [1]
查看完整版本: 能否让write函数写入的内容,直到fsync才真的写入磁盘呢?