第二次检查后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 &lt;errno.h&gt; 我在终端窗口中运行代码,并让它等待用户击键。然后在第二个终端窗口中,我一遍又一遍地运行代码。它总是输出: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 在第二次加载时不呈现检查属性

允许在第二次检查时将单选字段设置为可取消检查

关于flock文件锁的阻塞与非阻塞

需要特定的cron作业解释,使用flock -n + .lock文件+ / bin / bash

第二次作业

带有 jQ​​uery UI 对话框、拼写检查和按钮在第二次单击时不起作用的 CKEditor