在一个过程中,我使用GENERIC_READ | GENERIC_WRITE、FILE_SHARE_READ | FILE_SHARE_WRITE、OPEN_ALWAYS和FILE_ATTRIBUTE_NORMAL作为参数来调用createfile。然后,我对整个文件调用了LockFileEx。我获得了一个独占锁,锁的范围是从0到UINT_MAX。
然后,在另一个过程中,我调用::CreateFileW(path.c_str(),perms,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
它删除了文件的内容。当我的另一个进程锁定(独占)文件时,它不应该这样做吗?
我希望其他进程能够获得该文件的句柄(这就是我使用file_share标志的原因),但我假设当另一个进程锁定该文件时,它们根本不能更改该文件,因此我执行了如下操作
创建文件lockfileex
并使其在lockfileex上被阻塞,直到另一个文件释放锁为止。是我一个人的问题,还是微软的行为有问题?
发布于 2011-11-19 11:29:43
当你试图用CREATE_ALWAYS打开一个文件时,Windows是否应该遵守文件锁定是有争议的,但从你的笔记看,它似乎不应该。防止其他进程写入您已打开的文件的最好方法是不要在您的独占进程中指定FILE_SHARE_WRITE。
但是,这不会给您提供在没有轮询的情况下从文件锁实现获得的等待行为。无法以独占访问方式打开文件,并让试图打开该文件的任何其他文件等待,直到具有独占访问权限的进程放弃该访问权限。
如果您可以访问所有涉及到的进程的源代码,那么您可以让尝试截断文件的进程首先调用某个区域上的LockFileEx,然后在获得锁之后调用SetFileSize。
作为附注,如果一个进程打开文件并试图写入UINT_MAX +1处的位置(刚刚超过4 4GB ),那么仅将区域从0字节锁定到UINT_MAX并不会提供互斥。
https://stackoverflow.com/questions/8189234
复制相似问题