_locking()真正做了什么?

时间:2011-07-27 11:31:01

标签: c++ c file winapi file-locking

寻找this问题的答案,我找到了函数_locking()。有人告诉它Locks or unlocks bytes of a file(实际上我无法理解这句话究竟是什么意思)。如果有人有使用此功能的经验,是否可以使用该功能解决第一个问题中描述的问题?

4 个答案:

答案 0 :(得分:1)

引用您链接的MSDN页面:

int _locking(
   int fd,
   int mode,
   long nbytes 
);
  

_locking 功能可锁定或解锁 fd 指定的文件的 nbytes 字节。锁定文件中的字节可防止其他进程访问这些字节。所有锁定或解锁都从文件指针的当前位置开始,然后继续执行下一个 nbytes 字节。可以将字节锁定在文件末尾。

答案 1 :(得分:1)

它只保留一个文件范围,专门用于获取文件锁的进程。如果锁定调用成功,则尝试读取或写入该部分文件的另一个进程将失败。这允许多个进程访问同一文件并以连贯的方式更新它。它有点像一个文件范围的互斥锁。

基本上它允许您以原子方式更新文件的某些部分,因此读取或写入文件的任何其他进程都将看到(或更改)所有更新,或者都不会。它也适用于读取 - 您可以锁定要读取的文件范围,以防止另一个进程在您正在阅读时更改其中的一部分。

但是进程仍然可以访问文件的其他部分而不会出现错误或延迟。

它不会解决您所引用的问题中的问题,因为_lock() on; t适用于流程粒度。如果线程A锁定文件范围,则同一进程中的线程B仍然可以读取/写入该范围。为了防止同一进程中的另一个线程访问文件范围,该进程必须实现自己的内部机制,以尊重文件范围已被另一个线程锁定。至少我没有意识到在Win32 API中有这样的东西(我想可能会有一些我不知道的东西)。

答案 2 :(得分:0)

http://msdn.microsoft.com/en-us/library/8054ew2f(v=vs.71).aspx

我发现这有助于“修复”问题Race condition

写入文件的最后一个人获胜。假设您只需要读取文件的前半部分,无理由锁定整个文件。

因此,您将文件大小以字节为单位传递给此函数,然后将其锁定。

如果成功,该函数将返回0。返回值-1表示失败,在这种情况下,errno设置为MSDN页面告诉您的内容。

回答您的问题

您可以获取文件的大小然后将其锁定,但您只能从文件中读取。你只能将它锁定在某种阅读模式中。

在Race条件的wiki中,它告诉你如何锁定文件的示例,方法是让第二个进程检查一个标志,这可能会在你的情况下查看它。

答案 3 :(得分:0)

它可以防止其他进程访问该文件的同一部分。