单例过程的跨平台代码?

时间:2017-09-19 10:49:01

标签: c++ singleton cross-platform

我有一种情况需要开发一个代码,每个机器只能有一个实例。我的代码应该与平台无关。直到这样它很好,但问题是除了我的二进制文件之外我不能有任何其他文件。我使用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//
}
}

1 个答案:

答案 0 :(得分:0)

最简单的编辑是

#ifndef WIN32
#define PATH "/export/home/dath/Desktop/singleTon.bin"
#else
#define PATH "<some path in C that you want>"
#endif

这迫使路径成为Windows的一件事,而其他所有平台则是其他东西。

据说还有其他更简洁的方法可以做到这一点,例如共享内存,这意味着你不必担心将文件留在地方或硬编码路径。