linux - Linux flock(fd, LOCK_EX|LOCK_NB) 会虚假地失败吗?

标签 linux nonblocking file-locking flock

考虑这样一种情况,其中两个进程并发尝试使用 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/

相关文章:

linux - bash 脚本中的时间性能增强

c++ - Ncurses - 如何将某些内容添加到输入缓冲区中

python - 在 python 中创建非阻塞套接字

objective-c - 如何在 objective-c 中编写非阻塞方法

python - 如何在 Python 中的多个异步进程之间进行同步?

sql-server - 系统进程正在锁定我的数据库文件 MDF

java - Java 中的 FileLock 在同一进程内或不同进程之间或两者之间跨多个线程是否安全?

c++ - Coredump 被截断

go - 如何在不阻塞 channel 的情况下用股票报告统计数据?

python - 仅修改 Python3 的 Python 路径