考虑这样一种情况,其中两个进程并发尝试使用 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
),答案都是一样的。如果没有,请告诉我。
最佳答案
阅读 man flock(2) :
EWOULDBLOCK The file is locked and the LOCK_NB flag was selected.
所以得到 EWOULDBLOCK 意味着文件已经被锁定。如果保证您的两个进程是唯一涉及的进程,它们将永远不会同时在同一个文件上获得 EWOULDBLOCK。
请注意线程是另一回事。线程通常共享文件描述符,因此同一进程中的多个线程可以在同一文件上成功调用 flock()。
关于linux - Linux flock(fd, LOCK_EX|LOCK_NB) 会虚假地失败吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21117264/