15

flock我已经阅读了关于/ lockf/之间区别的足够多的关于 stackoverflow 的帖子,fcntl但我无法回答以下观察结果:

>>> import fcntl
>>> a = open('/tmp/locktest', 'w')
>>> b = open('/tmp/locktest', 'w')
>>> fcntl.lockf(a, fcntl.LOCK_EX | fcntl.LOCK_NB)
>>> fcntl.lockf(a, fcntl.LOCK_EX | fcntl.LOCK_NB)
>>> fcntl.lockf(b, fcntl.LOCK_EX | fcntl.LOCK_NB)
>>>
>>> a.close()
>>> b.close()

>>> a = open('/tmp/locktest', 'w')
>>> b = open('/tmp/locktest', 'w')
>>> fcntl.flock(a, fcntl.LOCK_EX | fcntl.LOCK_NB)
>>> fcntl.flock(a, fcntl.LOCK_EX | fcntl.LOCK_NB)
>>> fcntl.flock(b, fcntl.LOCK_EX | fcntl.LOCK_NB)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 35] Resource temporarily unavailable

为什么这两种情况下的行为不同?我知道显而易见的答案是,这是两种不同的锁定机制。我在寻找:

  1. 归档( )实际上lockf()flock()做什么inode/fd
  2. 根据演示,我们是否允许递归获取相同的锁?

我了解基础知识fds和东西,所以我希望有一个对操作系统级别细节有更多见解的技术答案。

OSX 10.9.3,Python:2.7.5

4

1 回答 1

12

关于此的一篇不错的文章: 关于文件锁定的破坏

简而言之:

  • POSIX 锁:

    lockf() 大部分时间都实现为 fcntl() 的一个接口

    fcntl() 锁绑定到进程,而不是文件描述符。如果一个进程对一个特定的文件有多个打开的文件描述符,则这些用于获取锁定的文件描述符中的任何一个都将重置锁定。

  • BSD锁:

    flock() 锁绑定到文件描述符,而不是进程。

此外

一个很好的测试分析: 建议文件锁定——我对 POSIX 和 BSD 锁的看法

摘要摘录:

  • fcntl 和flock 风格的锁彼此完全正交。任何同时提供两者的系统(Linux 提供)都将独立处理通过它们中的每一个获得的锁。
  • 当进程退出或中止时,POSIX 和 BSD 锁都会自动释放。
  • POSIX 和 BSD 锁都在 execve 调用中保留,除非进程设置了 FD_CLOEXEC 标志,强制关闭文件描述符,并且不被新进程继承。
于 2016-01-21T22:03:06.753 回答