我在Centos 5上运行的C ++应用程序中遇到如下问题:
在机器A上,机器C上有一个包含文件的NFS安装驱动器:
/nfs/mounted/drive/path/directory/file
我的应用程序重命名机器A的目录:
mv /nfs/mounted/drive/path/directory /nfs/mounted/drive/path/directory.old
机器A上的应用程序然后ssh(s)到机器B运行我创建的应用程序,首先检查文件是否存在:
/nfs/mounted/drive/path/directory/file
发现文件存在(这是竞争状态,机器B仍然看到旧状态),因此机器B继续进行,就像文件存在一样,但机器B随后在打开时失败文件并没有真正存在。
我尝试通过在检查文件之前在计算机B上的应用程序中调用sync()
来解决此问题。我也尝试过echo 2 > /proc/sys/vm/drop_caches
,但这些都没有导致我在机器B上的应用程序立即看到文件的当前状态消失。
在检查文件以确保数据是最新状态之前,我在机器B上的C ++应用程序中可以做些什么?我不想通过打开它来显式测试有问题的文件,而是希望使磁盘处于当前状态。我想以相对快速的方式从C ++中强制同步,因为花费的时间不到四分之一秒。
答案 0 :(得分:1)
NFS每个文件系统对象都有一个文件句柄。在重命名目录时,filemhandle没有更改,查找会给出正面结果。为了更好地避免这种情况创建新目录,请从原始目录移动所有文件和目录并删除源目录。这样,您将使旧文件句柄无效。