【发布时间】:2026-02-14 11:50:01
【问题描述】:
我有一种情况要开发一种代码,该代码在任何时候每台机器只能有一个实例。而且我的代码应该是平台无关的。直到这很好,但问题是我不能有任何其他文件,除了我的二进制文件。我使用 fcntl 开发了一个代码,我的逻辑是我将自己锁定我的二进制文件,所以每次代码运行时它都会检查它是否可以锁定,如果不能锁定则返回。这个逻辑在 ubuntu、solaris 机器上运行良好,但在 windows 中我发现这个逻辑不再有效,因为我无法打开正在运行的 exe 文件。在这里,我附上了我卡住的代码。如果您觉得这不是正确的门户,或者您觉得我的研究没有用,请见谅。任何建议都会对我有很大帮助。
#include<iostream>
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#define PATH "<my binary path>"
using namespace std;
int main(){
int lockfd;
FILE *FP = fopen(PATH,"wb");
if (!FP)
{
if(errno==16){
cout<<"programme is currently running hence I quit\n";// windows
}else{
cout<<"error while opening the given file\n";
cout<<"errno = "<<errno<<"\n";
}
return 1;
}else{
lockfd = fileno(FP);
}
cout<<lockfd<<"\n";
cout<<"errno = "<<errno<<"\n";
struct flock lock;
lock.l_start = 0;
lock.l_len = 0;
lock.l_type = F_WRLCK;//F_RDLCK;
lock.l_whence = SEEK_SET;
lock.l_pid = getpid();
int rc = fcntl(lockfd, F_SETLK, &lock);
cout<<"rc = "<<rc<<"\n";
cout<<"errno = "<<errno<<" eagain ="<<EAGAIN<<"\n";
if (rc == -1 && errno == EAGAIN) {
cout<<"cant lock now hence I quit\n";
return 0;
}else{
cout<<"lock done\n";
sleep(10);
//rest of the code//
}
}
【问题讨论】:
-
#ifdef windows #else #endif : *.com/questions/4191465/…
-
在 Unix 上执行此操作的首选方法是 /var/run 中的 pidfile。锁定 exe 不会阻止以不同名称或路径运行的多个副本。
-
你可以创建一个独特的命名信号量,这样第二次尝试就会失败
-
你是多线程还是多处理(或两者都不是)?
-
我也有多个线程和进程,但我在创建所有这些之前检查了锁。你也不能想。因为在程序通过此检查后我不会打扰这个锁
标签: c++ singleton cross-platform