J'ai une situation pour développer un code qui ne peut avoir qu'une seule instance par machine à tout moment. Et mon code devrait être indépendant de la plateforme. Jusqu'à ce que ce soit bien, mais le problème est que je ne peux pas avoir d'autres fichiers, sauf mon binaire. J'ai développé un code en utilisant fcntl, ma logique est que je verrouille mon binaire lui-même, donc à chaque fois que le code s'exécute il vérifie s'il peut se verrouiller et retourne s'il ne le peut pas. Cette logique fonctionnait bien dans les machines ubuntu, solaris, mais dans Windows j'ai trouvé que cette logique ne fonctionne plus car je ne peux pas ouvrir le fichier exe en cours d'exécution. Ici, j'ai joint mon code où je me suis coincé. Veuillez m'excuser si vous pensez que ce n'est pas le bon portail à poser, ou si vous pensez que ma recherche ne sert à rien. Toute suggestion sera d'une grande aide pour moi.code multiplateforme pour le processus singleton?
#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: https://stackoverflow.com/questions/4191465/how-to-run-only-one-instance-of-application – sailfish009
La méthode préférée pour ce faire sous Unix est un fichier pid dans/var/run. Le verrouillage de l'exe n'empêche pas l'exécution de plusieurs copies avec des noms ou des chemins différents. – stark
vous pouvez créer un sémaphore nommé de quelque chose d'unique de sorte que la deuxième tentative échouera – mark