寻找这个问题的答案我找到了函数_locking()。那里告诉它Locks or unlocks bytes of a file
(实际上我无法理解这句话的真正含义)。如果有人有使用此功能的经验,是否可以使用该功能解决第一个问题中描述的问题?
4 回答
引用您链接的 MSDN 页面:
int _locking(
int fd,
int mode,
long nbytes
);
_locking函数锁定或解锁fd指定的文件的nbytes字节。锁定文件中的字节可防止其他进程访问这些字节。所有锁定或解锁都从文件指针的当前位置开始,并继续进行下一个nbytes字节。可以锁定文件末尾之后的字节。
它只是保留一个文件范围,供获得文件锁的进程独占使用。如果锁调用成功,另一个尝试读取或写入该文件部分的进程将失败。这允许多个进程访问同一个文件并以一致的方式更新它。它有点像一个文件范围的互斥锁。
基本上,它允许您以原子方式更新文件的某些部分,因此任何其他读取或写入文件的进程都将看到(或更改)所有更新,或者一个都看不到。它也适用于读取 - 您可以锁定要读取的文件范围,以防止另一个进程在您正在读取文件时更改其中的一部分。
但是进程仍然可以访问文件的其他部分而不会出错或延迟。
它不会解决您所指的问题中的问题,因为_lock()
on;t 在进程粒度上工作。如果线程 A 锁定了一个文件范围,那么同一进程中的线程 B 仍然可以读取/写入该范围。为了防止同一进程中的另一个线程访问文件范围,该进程必须实现自己的内部机制,以尊重文件范围已被另一个线程锁定。至少我不知道在 Win32 API 中有什么东西(我想可能有一些我不知道的东西)。
它可以防止其他进程访问文件的同一部分。
http://msdn.microsoft.com/en-us/library/8054ew2f(v=vs.71).aspx
我发现这有助于“解决”问题竞赛条件!
最后写入文件的人获胜。假设您只需要读取文件的前半部分,就没有理由锁定整个文件。
因此,您将文件大小(以字节为单位)传递给此函数,然后将其锁定。
如果成功,该函数将返回 0。返回值 –1 表示失败,在这种情况下 errno 设置为 MSDN 页面告诉您的内容。
回答你的问题
您可以获取文件的大小,然后将其锁定,但您只能从文件中读取。您只将其锁定为一种读取模式。
在 Race condition 的 wiki 中,它告诉您如何通过获取第二个进程来检查标志来锁定文件的示例,这可能适用于您的情况。