我已经在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
为什么两种情况下的行为不同?我知道这两个不同的锁定机制的明显答案。我在寻找:
我理解fds
的基础知识和内容,所以我希望得到一个技术答案,更多地了解操作系统级详细信息。
OSX 10.9.3,Python:2.7.5
答案 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标志,强制关闭文件描述符,而不是由新进程继承。