Exécutable et Paramètres
Fermé
johann74270
-
9 janv. 2015 à 09:26
Sugel Messages postés 4068 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 - 21 janv. 2015 à 17:07
Sugel Messages postés 4068 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 - 21 janv. 2015 à 17:07
A voir également:
- Exécutable et Paramètres
- Antimalware service executable ram - Forum antivirus
- Paramètres s'arrête systématiquement - Forum Samsung
- Fichier executable unix ✓ - Forum MacOS
- Windows update un problème s'est produit. essayez d'ouvrir paramètres plus tard ✓ - Forum Windows
- Le bon coin mon compte parametres - Guide
1 réponse
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
48
9 janv. 2015 à 16:53
9 janv. 2015 à 16:53
Bonjour
il faut avant tout vérifier si une instance de ce logiciel est pas déjà active en clair, si elle est en pas en cours d'utilisation. Si c'est le cas, on lui passe les différents arguments lui permettant d'effectuer la tâche solicité sans pour autant démarrer une autre instance exemple, d'algorithmes simple
à bientôt
il faut avant tout vérifier si une instance de ce logiciel est pas déjà active en clair, si elle est en pas en cours d'utilisation. Si c'est le cas, on lui passe les différents arguments lui permettant d'effectuer la tâche solicité sans pour autant démarrer une autre instance exemple, d'algorithmes simple
liste ou file de commande LIST (de type Fifo)
si pas d'instance start
faire :
LIST <-- argument à executer;
Executer App
Traiter LIST
sinon si LIST:
faire:
LIST <-- argument
Traiter LIST
sinon:
Executer App sans arg
à bientôt
17 janv. 2015 à 02:37
Avec un PIPE ?
17 janv. 2015 à 18:55
18 janv. 2015 à 00:45
18 janv. 2015 à 01:02
Modifié par sambia39 le 18/01/2015 à 07:13
le PIPE va être utilisée pour envoyer les arguments ou certaines commandes à l'application qui a déjà une instance active.
Ce qui intéresse @johann74270 c'est comment avoir une seule instance effectivement sous Windows ça l'air simple il suffit de faire appel aux routines système pour savoir si un processus ne porte pas déjà le même nom de l'application x mais sur UNIX/ GNU LInux c'est autre chose.
La plupart des développeurs utilise un verrou sur fichier exemple fichier.pid certes, c'est une des méthodes utile mais elle présente des défaut car, on peut contourner le problème avec la commande suit dans le terminal exemple
(rappel:en utilise un mécanisme de verrou est basé sur un fichier).
il existe également d'autre méthodes comme les D-BUS ou SOCKET UNIX d'autres utilise la mémoire partagée, IPC etc. en clair chacun ça méthode
exemple : /!\attention: c'est un code qui n'est pas optimisé et peut comporter des erreurs dont je m'en excuse d'avance
#ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE #endif #if ! defined(_XOPEN_SOURCE) || _XOPEN_SOURCE < 500 #define _XOPEN_SOURCE 500 #endif #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <pthread.h> typedef enum{ false, true }bool; /* Constance fichier de verrou */ #define _INSTANCE_ "CCM_INSTANCE_START" /** * Fonction qui teste en premier l'existence d'un vérrou * si pas de vérrou alors, l'application crée * le fichier vérrou et à ce titre devient l'unique instance **/ bool bf_Create_Secure_Instance( void ){ int iFlag = 0; iFlag = open( _INSTANCE_, O_RDONLY ); if( iFlag == -1 ){ iFlag = open(_INSTANCE_, O_RDWR | O_CREAT, S_IRWXU ); if( iFlag == -1 ){ return( false ); }else{ close( iFlag ); return( true ); } }else return( false ); } /*** * la fonction est idem à la fonction * bf_Create_Secure_Instance **/ bool bf_Create_Secure_Instance_2( void ){ int iFlag = 0; FILE *pFlux = NULL; iFlag = open( _INSTANCE_, O_RDONLY ); if( iFlag == -1 ){ pFlux = fopen( _INSTANCE_, "w" ); fclose( pFlux ); return( true ); } return( false ); } /*** * Cette fonction procède de la même manière que les autres * mais en utilisant les PIPE. si le fichier verrous * existe déjà alors en utile le fichier que l'on ouvre comme * pipe en injectant les arguments. * le traitement des informations du flux pourra être exécuté * par un thread de lecture de flux du programme en instance **/ bool bf_isInstance( const char *p ){ int iFlag = 0; FILE *pFlux = NULL; iFlag = open( _INSTANCE_, O_RDONLY ); if( iFlag != -1 ){ pFlux = popen( p, "w+"); if( pFlux == NULL ){ return( false ); } if( pclose( pFlux ) == -1 ){ return( false ); } } return ( bf_Create_Secure_Instance_2() ); } /* Supression du fichier */ void f_uInstance( void ){ remove( _INSTANCE_ ); } int main( void ){ /* Teste instance 1 */ /*if( !bf_Create_Secure_Instance() ){ printf("Une instance existe dejà\n"); exit( EXIT_SUCCESS ); }*/ /* Teste instance 2 */ if( !bf_Create_Secure_Instance_2() ){ printf("Une instance existe dejà\n"); exit( EXIT_SUCCESS ); } /* * Instance 3 avec injection * qui peut être également argv[2] */ /*if( !bf_isInstance("source.c") ){ printf("Une instance existe dejà\n"); exit(EXIT_SUCCESS); }*/ getchar(); f_uInstance(); return( EXIT_SUCCESS ); }à bientôt