我有一种情况需要开发一个代码,每个机器只能有一个实例。我的代码应该与平台无关。直到这样它很好,但问题是除了我的二进制文件之外我不能有任何其他文件。我使用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//
}
}
答案 0 :(得分:0)
最简单的编辑是
#ifndef WIN32
#define PATH "/export/home/dath/Desktop/singleTon.bin"
#else
#define PATH "<some path in C that you want>"
#endif
这迫使路径成为Windows的一件事,而其他所有平台则是其他东西。
据说还有其他更简洁的方法可以做到这一点,例如共享内存,这意味着你不必担心将文件留在地方或硬编码路径。