【发布时间】:2014-01-14 15:26:43
【问题描述】:
考虑两个进程同时尝试使用flock(fd, LOCK_EX|LOCK_NB) 对某个文件设置排他锁的情况。
如前所述,尝试是非阻塞的,因此两个进程之一应该以EWOULDBLOCK 失败。
这是我的问题:flock() 的 (Linux) 实现是否保证这两个进程中的一个在每种情况下都会成功?或者,即使没有其他人干预,是否有可能两者都以EWOULDBLOCK 告终?
简而言之,flock(fd, LOCK_EX|LOCK_NB) 是否可以通过 EWOULDBLOCK 虚假失败?
我主要对 Linux 提供的flock() 版本感兴趣,但欢迎在其他系统(例如 OS X)上提供有关flock() 的信息。
另外,我假设无论锁是独占的 (LOCK_EX) 还是共享的 (LOCK_SH),答案都是一样的。如果没有,请告诉我。
【问题讨论】:
-
如果你所说的发生了,它应该被认为是一个错误。这类似于 2 个进程试图获取互斥锁或信号量,并且在当前没有任何东西持有锁时都失败了。
-
只是出于好奇:您在哪个文件系统上观察到这个?
-
@alk 我没有注意到这一点。我只是想了解
flock(fd, LOCK_EX|LOCK_NB)永远不会虚假失败的假设的正确性。你知道flock()的实现是否依赖于文件系统吗? -
flock不适用于某些 NFS 文件系统。这取决于实现。 -
@Duck 但是 EXT4 和 BTRFS 是否有不同的
flock()实现,例如?
标签: linux nonblocking file-locking flock