Linux flock(fd,LOCK_EX | LOCK_NB)可以虚假地失败吗?

时间:2014-01-14 15:26:43

标签: linux nonblocking file-locking flock

考虑这样一种情况:两个进程同时尝试使用flock(fd, LOCK_EX|LOCK_NB)对某个文件进行独占锁定。

如上所述,尝试是非阻塞,因此两个进程中的一个应该以{{1​​}}失败。

以下是我的问题:EWOULDBLOCK的(Linux)实现是否保证两个进程中的一个在每种情况下都会成功?或者,即使没有其他人在干涉,它们是否有可能最终以flock()失败?

简而言之,EWOULDBLOCK可以flock(fd, LOCK_EX|LOCK_NB)虚假失败吗?

我主要对Linux提供的EWOULDBLOCK版本感兴趣,但欢迎在其他系统(如OS X)上提供有关flock()的信息。

此外,我假设答案是相同的,无论锁是独占(flock())还是共享(LOCK_EX)。如果没有,请告诉我。

1 个答案:

答案 0 :(得分:1)

阅读man flock(2)

  

EWOULDBLOCK       文件已锁定,并且已选择LOCK_NB标志。

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

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