6

考虑这样一种情况,两个进程同时尝试使用flock(fd, LOCK_EX|LOCK_NB).

如前所述,尝试是非阻塞的,因此两个进程之一应该以EWOULDBLOCK.

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

简而言之,可以flock(fd, LOCK_EX|LOCK_NB)EWOULDBLOCK?

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

另外,我假设无论锁是独占的(LOCK_EX)还是共享的(LOCK_SH),答案都是一样的。如果没有,请告诉我。

4

1 回答 1

1

阅读人羊群(2)

EWOULDBLOCK 文件被锁定并选择了 LOCK_NB 标志。

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

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

于 2014-01-14T17:13:14.947 回答