【发布时间】:2015-04-12 18:17:42
【问题描述】:
关于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
【问题讨论】:
-
我冒昧地编辑了问题以实际包含一个问题。如果这不是您要的,请查看和编辑。谢谢。
-
@NPE:这是我第一句话的一部分,但最好明确地放在那里。谢谢:)
标签: python file-locking flock fcntl