【问题标题】:Can Linux flock(fd, LOCK_EX|LOCK_NB) fail spuriously?Linux flock(fd, LOCK_EX|LOCK_NB) 会虚假失败吗?
【发布时间】: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


【解决方案1】:

阅读man flock(2)

EWOULBLOCK 文件被锁定并且LOCK_NB标志被选中。

所以获得 EWOULDBLOCK 意味着文件已经被锁定。如果保证您的两个进程是唯一涉及的进程,则它们永远不会同时在同一个文件上获得 EWOULDBLOCK。

请注意,线程是另一回事。线程通常共享文件描述符,因此同一个进程中的多个线程可以在同一个文件上成功调用flock()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-26
    • 2016-02-27
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多