python lockf和flock行为

时间:2015-02-12 05:50:35

标签: python file-locking flock fcntl

我已经在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

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

  1. lockf()或flock()实际上对文件(inode / fd)做了什么?
  2. 根据演示,我们是否允许递归地使用相同的锁?
  3. 我理解fds的基础知识和内容,所以我希望得到一个技术答案,更多地了解操作系统级详细信息。

    OSX 10.9.3,Python:2.7.5

1 个答案:

答案 0 :(得分:7)

一篇关于此的好文章: On the Brokenness of File Locking

简而言之:

  • POSIX锁:

      

    lockf()大部分时间都是作为fcntl()

    的接口实现的      

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

  • BSD锁:

      

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

此外

对测试的良好分析: Advisory File Locking – My take on POSIX and BSD locks

摘要摘录:

  
      
  • fcntl和flock样式锁彼此完全正交。任何提供这两者的系统(Linux都会)将独立处理通过它们中的每一个获得的锁。
  •   
  • 当进程退出或中止时,POSIX和BSD锁都会自动释放。
  •   
  • 除了execve调用之外,POSIX和BSD锁都被保留,除非进程设置了FD_CLOEXEC标志,强制关闭文件描述符,而不是由新进程继承。
  •