【发布时间】: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 blockI.E.在我的系统上,ubuntu linux 14.04,它总是可以正常工作 -
谢谢,我也可以在 Ubuntu 上运行它。l 看起来这是一个 OS X 特定的问题。我已经更新了问题