我看过足够多关于
flock
/lockf
/fcntl
之间区别的stackoverflow帖子,但我无法回答以下观察问题:>>> 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
这两种情况的行为为什么不同?我知道显而易见的答案是这是两种不同的锁定机制。我正在寻找:
lockf()
或flock()
实际上对文件(inode/fd
)执行了什么操作?- 根据演示,我们可以递归地获取相同的锁吗?
我理解fds
和相关内容的基础知识,因此我更喜欢有更深入的技术答案,涉及操作系统级别的细节。
OSX 10.9.3,Python:2.7.5