Everything you never wanted to know about file locking (2010)
4 months ago
- #file-locking
- #python
- #unix
- Unix文件锁定机制复杂且系统间差异大,主要有三种API:flock()、fcntl()和lockf()
- flock()简单但非POSIX标准,不支持NFS网络文件系统,且锁升级时存在竞态条件
- fcntl()符合POSIX标准,支持字节范围锁,但存在反设计行为——当任意文件描述符关闭时锁会丢失
- lockf()也是POSIX标准,但在BSD系统上可能不受支持,且无法查询锁归属
- 同一文件混用不同锁类型(flock/fcntl/lockf)会导致未定义行为且不可移植
- 强制锁不可靠应避免使用,咨询锁才是合理选择
- Python的fcntl模块虽支持三种锁,但存在自身特性和不一致行为
- MacOS X 10.6的fcntl(F_SETLK)存在静默文件损坏漏洞,曾影响sqlite等程序
- Windows 10 WSL的fcntl()锁实现存在缺陷——总是返回成功,实际会导致文件损坏
- Linux在2015年推出F_OFD_SETLK作为传统fcntl锁的更优替代,但目前尚未广泛普及