第二次检查后flock lock丢失
Posted
技术标签:
【中文标题】第二次检查后flock lock丢失【英文标题】:flock lock is lost after the second check 【发布时间】:2015-11-16 16:05:12 【问题描述】:我正在使用flock
来防止对共享资源的并发访问。我第一次检查锁时它工作正常,但我第二次检查锁时,尽管锁仍然被另一个进程持有,我还是能够成功获得它。
我正在使用以下代码:
#include <stdio.h>
#include <sys/file.h>
#include <errno.h>
int main(void)
printf("App started:\n");
int fd = open("test.lock", O_RDWR | O_CREAT, 0666); // open or create lockfile
//check open success...
int rc = flock(fd, LOCK_EX | LOCK_NB); // grab exclusive lock, fail if can't obtain.
if (rc)
printf("Failed .. lock is already held\n");
if(EWOULDBLOCK == errno)
printf("errno said, that we would block\n");
return 0;
else
printf("Lock obtained\n");
printf("Press ENTER...\n");
getc(stdin);
return 0;
平台:OSX 10.10。
如果我在两个单独的终端窗口中运行程序,我会得到以下输出:
第一个窗口 - 应用获取锁并等待按键被按下
应用启动: 获得锁 按回车...
第一次运行第二个终端窗口 - 应用程序成功发现锁已被其他人持有
应用启动: 失败..锁已被持有 errno 说,我们会阻止
第二个终端窗口第二次运行 - 尽管第一个实例已经持有它,但应用程序仍获得了锁
应用启动: 获得锁 按回车...
好像测试锁也会释放它......
有什么想法吗?
更新:这看起来像 OS X 相关问题。该代码在 14.04 32 位上没有问题。 马特拉
【问题讨论】:
这似乎是 C 代码。您添加 C++ 标记的任何有效原因? 检查错误。并释放锁! 这个代码块:` printf("Failed .. lock is already hold\n"); if(EWOULDBLOCK == errno) printf("errno 说,我们会阻塞\n"); ` 可以简化为一行:perrof( 'flock failed");
,因为它会打印包含的文本以及相应的系统错误消息。那么不需要声明:#include <errno.h>
我在终端窗口中运行代码,并让它等待用户击键。然后在第二个终端窗口中,我一遍又一遍地运行代码。它总是输出:App started: Failed .. lock is already held errno said, that we would block
I.E.在我的系统上,ubuntu linux 14.04,它总是可以正常工作
谢谢,我也可以在 Ubuntu 上运行它。l 看起来这是一个 OS X 特定的问题。我已经更新了问题
【参考方案1】:
原来 OS X 上的问题是程序是从网络安装目录(Windows 共享)运行的。锁在 NFS 上不能可靠地工作。详情请见https://***.com/a/22411531/174638。
【讨论】:
以上是关于第二次检查后flock lock丢失的主要内容,如果未能解决你的问题,请参考以下文章
REACT - defaultChecked 在第二次加载时不呈现检查属性