- 论坛徽章:
- 0
|
20可用积分
本帖最后由 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这两点互相矛盾啊!
还请大侠解释一下我的疑惑! |
最佳答案
查看完整内容
回复 1# ejeker 这测试靠谱吗?你看看apue 3.14节测试用的方法吧
|