Jat*_*mar 9 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
Run Code Online (Sandbox Code Playgroud)
为什么两种情况下的行为不同?我知道这两个不同的锁定机制的明显答案.我在寻找:
我理解基础知识fds和东西,所以我更愿意获得技术答案,更深入地了解操作系统级细节.
OSX 10.9.3,Python:2.7.5
小智 9
一篇关于此的好文章: 关于文件锁定的破碎性
简而言之:
POSIX锁:
lockf()大部分时间只作为fcntl()的接口实现
fcntl()锁绑定到进程,而不是文件描述符.如果进程具有针对特定文件的多个打开文件描述符,则用于获取锁定的这些文件描述符中的任何一个将重置锁.
BSD锁定:
flock()锁绑定到文件描述符,而不是进程.
对测试的一个很好的分析: 咨询文件锁定 - 我对POSIX和BSD锁的看法
摘要摘录:
- fcntl和flock样式锁彼此完全正交.提供两者的任何系统(Linux都会)将独立处理通过它们中的每一个获得的锁.
- 当进程退出或中止时,POSIX和BSD锁都会自动释放.
- POSIX和BSD锁都在execve调用中保留,除非进程设置了FD_CLOEXEC标志,强制关闭文件描述符,而不是由新进程继承.
| 归档时间: |
|
| 查看次数: |
6250 次 |
| 最近记录: |