免费注册 查看新帖 |

Chinaunix

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

read不到文件的最新内容? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-27 13:46 |只看该作者 |倒序浏览
用O_RDONLY|O_DIRECT参数open文件,然后read,发现读出来的文件内容没有变化,但实际上文件内容有变化,why?

论坛徽章:
0
2 [报告]
发表于 2007-06-27 13:57 |只看该作者
但实际上文件内容有变化 你通过什么知道的?

论坛徽章:
0
3 [报告]
发表于 2007-06-27 13:58 |只看该作者
可能是写文件的人没有调用fsync?

论坛徽章:
0
4 [报告]
发表于 2007-06-27 14:10 |只看该作者
实际上是windows上一个程序改变了文件的内容,这点可以确定。文件位于windows机器上的共享目录,linux通过fstab文件在启动时mount这个目录并访问这个目录下的文件,会不会是这样mount的文件会被linux做一个缓冲?

论坛徽章:
0
5 [报告]
发表于 2007-06-27 14:12 |只看该作者
用的samba ?

论坛徽章:
0
6 [报告]
发表于 2007-06-27 14:19 |只看该作者
原帖由 albcamus 于 2007-6-27 13:58 发表
可能是写文件的人没有调用fsync?


这个问题LZ前几天问过。应用场景大致是windows和linux通过CIFS实现文件共享,然后windows下写文件,linux下进行读入。

就是那个关于fsopen的linux实现的问题。这是个windows下的CRT函数,本身就是带缓冲的函数。


在windows那边就应当使用无缓冲I/O,我记得CreateFile函数有一个标志可以实现无缓冲I/O.

第二个就是思一克兄说得如何感知文件内容变化,不知道LZ是怎么做的。我想可以考虑fam、inotify之类的文件更改检测机制。

第三个就是检测到文件更改通知后,打开文件,读取文件更改部分,然后关闭文件。


用O_RDONLY|O_DIRECT参数open文件,然后read,发现读出来的文件内容没有变化,但实际上文件内容有变化,why?


linux端无法获得还存在于windows缓存内的数据。

论坛徽章:
0
7 [报告]
发表于 2007-06-27 14:44 |只看该作者
这种情况还不同于本地文件,本地不fsync也能读到.可能是用户缓存的原因.

楼主说的感知,是不是说打开一遍看一下,关闭,然后重复

论坛徽章:
0
8 [报告]
发表于 2007-06-27 16:37 |只看该作者
对,目前实现是重复开关同一个文件,只要后面读进来的文件内容与内存中保存的上一次读取的文件内容不一致,就说已经检测到了文件的变化。
今天测试了另一种实现:文件仅open一次,定时lseek到要检测的部分,对这部分加锁,read这一部分,解锁,再与上次检测时保存的文件内容作比较,结果发现还是没有变化。
coldwarm兄说的情况我不是很清楚,但是写文件的程序是上海证交所提供的,我无法更改,我只知道window下的测试程序,使用fsopen打开同一个文件,可以快速的检测到文件变化

[ 本帖最后由 didida1975 于 2007-6-27 16:45 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2007-06-27 16:47 |只看该作者
TO LZ,

你2个系统,通过NFS,SMB或在一个机器上的虚拟机,从2个系统共同ACCESS同一个文件的问题。

如果确保写系统能写到磁盘,读的系统要看见新内容,应该关闭文件,重新打开再读。或DIRECTIO方式。

论坛徽章:
0
10 [报告]
发表于 2007-06-27 17:24 |只看该作者
open的参数是O_RDONLY|O_DIRECT,这应该是DIRECTIO方式吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP