单例进程的跨平台代码?

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”?

以上是关于单例进程的跨平台代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何实现一个简单的跨平台 Python 守护进程?

一体化HR SaaS+低代码平台加速企业数字化转型进程

.NET跨平台实践:.NetCore.Net5/6 Linux守护进程设计

C++ Static变量跨平台多线程安全性分析

如何在 .NET 和 Java 之间创建跨平台进程间通信?

java设计模式之 -- 单例模式