2017-09-19 5 views
0

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// 
} 
} 
+0

#ifdef windows #else #endif: https://stackoverflow.com/questions/4191465/how-to-run-only-one-instance-of-application – sailfish009

+2

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

+0

vous pouvez créer un sémaphore nommé de quelque chose d'unique de sorte que la deuxième tentative échouera – mark

Répondre

0

Le modifier pour faire plus simple serait

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

qui force le chemin à une chose pour les fenêtres, et quelque chose d'autre pour toutes les autres plates-formes. Cela dit, il existe d'autres façons plus simples de faire cela, comme la mémoire partagée, ce qui signifie que vous ne devriez pas avoir à vous soucier de laisser des fichiers autour de l'endroit ou de coder en dur leur chemin.

+1

La question n'a rien à voir avec la recherche du chemin. – stark

+0

WIN32 ou _WIN32? Quoi qu'il en soit, @stark a raison – Asesh

+0

Cela a tout à voir avec le fait de ne pas trouver le chemin. Comment vous attendez-vous à trouver "/export/home/dath/Desktop/singleTon.bin" sur une boîte de Windows? – UKMonkey