我已经在stackoverflow上阅读了有关b/w flock/lockf/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

为什么两种情况下的行为不同?我知道明显的答案,那就是这是两种不同的锁定机制。我在寻找:
  • 实际要归档(inode/fd)的lockf()或flock()是什么?
  • 根据演示,是否允许递归获取相同的锁?

  • 我了解fds和其他内容的基础知识,因此我希望有一个技术性的答案,对操作系统级别的详细信息有更多的了解。

    OSX 10.9.3,Python:2.7.5

    最佳答案

    关于此的一篇不错的文章:
    On the Brokenness of File Locking
    简而言之:

  • POSIX锁:

  • BSD锁定:


  • 此外
    一个很好的测试分析:
    Advisory File Locking – My take on POSIX and BSD locks
    摘要摘录:

    关于python lockf和flock行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28470246/

    10-10 14:47