单例进程的跨平台代码?
Posted
技术标签:
【中文标题】单例进程的跨平台代码?【英文标题】:cross-platform code for singleton process? 【发布时间】:2017-09-19 10:49:00 【问题描述】:我有一种情况要开发一种代码,该代码在任何时候每台机器只能有一个实例。而且我的代码应该是平台无关的。直到这很好,但问题是我不能有任何其他文件,除了我的二进制文件。我使用 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 不会阻止以不同名称或路径运行的多个副本。 你可以创建一个独特的命名信号量,这样第二次尝试就会失败 你是多线程还是多处理(或两者都不是)? 我也有多个线程和进程,但我在创建所有这些之前检查了锁。你也不能想。因为在程序通过此检查后我不会打扰这个锁 【参考方案1】:最简单的编辑是
#ifndef WIN32
#define PATH "/export/home/dath/Desktop/singleTon.bin"
#else
#define PATH "<some path in C that you want>"
#endif
这迫使路径对于 Windows 来说是一回事,而对于所有其他平台来说则是另一回事。
也就是说,还有其他更简洁的方法可以做到这一点,例如共享内存,这意味着您不必担心将文件留在原地或硬编码它们的路径。
【讨论】:
这个问题与寻找路径无关。 这与找不到路径有关。您希望如何在 Windows 框中找到“/export/home/dath/Desktop/singleTon.bin”?以上是关于单例进程的跨平台代码?的主要内容,如果未能解决你的问题,请参考以下文章