我使用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。
如果我在两个单独的终端窗口中运行程序,我会得到以下输出:
第一个窗口 - 应用程序获取锁定并等待按下键
应用已启动: 获得锁定 按ENTER ...
第二个终端窗口首次运行 - 应用程序发现,锁已被其他人持有
应用已启动: 失败..已经锁定了 errno说,我们会阻止
第二个终端窗口第二次运行 - 应用程序获得锁定,尽管第一个实例已经持有它
应用已启动: 获得锁定 按ENTER ...
好像测试锁定也会释放它......
有什么想法吗?
更新:这看起来与OS X相关的问题。代码在14.04 32位上没有问题。 马特拉
答案 0 :(得分:0)
事实证明,OS X上的问题是该程序是从网络安装目录(Windows共享)运行的。锁在NFS上无法可靠地工作。有关详细信息,请参阅https://stackoverflow.com/a/22411531/174638。