[linux] empêcher un programme de se lancer plusieurs fois : résolu

empêcher un programme de se lancer plusieurs fois : résolu [linux] - C - Programmation

Marsh Posté le 11-08-2003 à 10:40:12    

J'ai un programme qui sous linux.
 
Quand on clique sur l'icône sur le bureau,
parfois le programme se lance 2 fois  
(si on a le doigt trop lourd je pense).
 
Pour éviter des problèmes,
j'aimerais empêcher le programme de se lancer si
il tourne déjà.
 
j'ai d'abord écrit une valeur dans un fichier,
au début du programme je vérifie cette valeur,
et à la fin du programme je remet cette valeur à sa valeur d'origine,
mais si le programme plante, je ne sais pas la remettre à 0.
 
J'ai pensé à ouvrir un port série,
mais apparemment on peut l'ouvrir plusieurs fois
puisque je n'ai pas d'erreur quand je l'ouvre une seconde fois.
 
Ce que j'aimerais c'est un moyen de ce style
qui permettrait de retrouver son état à la sortie du programme,
même en cas de plantage (ce qui est le cas pour l'ouverture d'un port).


Message édité par warp le 11-08-2003 à 12:31:12

---------------
Il n'est pas nécéssaire de réussir pour persévérer.
Reply

Marsh Posté le 11-08-2003 à 10:40:12   

Reply

Marsh Posté le 11-08-2003 à 10:42:30    

warp a écrit :

J'ai un programme qui sous linux.
 
Quand on clique sur l'icône sur le bureau,
parfois le programme se lance 2 fois  
(si on a le doigt trop lourd je pense).
 
Pour éviter des problèmes,
j'aimerais empêcher le programme de se lancer si
il tourne déjà.
 
j'ai d'abord écrit une valeur dans un fichier,
au début du programme je vérifie cette valeur,
et à la fin du programme je remet cette valeur à sa valeur d'origine,
mais si le programme plante, je ne sais pas la remettre à 0.
 
J'ai pensé à ouvrir un port série,
mais apparemment on peut l'ouvrir plusieurs fois
puisque je n'ai pas d'erreur quand je l'ouvre une seconde fois.
 
Ce que j'aimerais c'est un moyen de ce style
qui permettrait de retrouver son état à la sortie du programme,
même en cas de plantage (ce qui est le cas pour l'ouverture d'un port).


 
tu pourrais peut-être regarder dans le liste des processus s'il y en a pas déjà un correspondant à ton appli.

Reply

Marsh Posté le 11-08-2003 à 10:44:00    

Faut créer un Mutex.
Un article très complet là dessus :
http://www.codeproject.com/cpp/avoidmultinstance.asp
ou si tu es pressé :
http://support.microsoft.com/defau [...] bContent=1
 
Veux-tu limiter ton appli à une instance par utilisateur ou par poste ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 11-08-2003 à 10:44:50    

réponse à rufo : pourquoi pas,
mais dans mon cas je fais plusieurs fork,
donc j'ai plusieurs process qui portent le même nom.
 
.....je peux aussi compter ces process,
mais faut que je vérifie qu'il n'y a pas de fork qui se font de temps en temps.....


Message édité par warp le 11-08-2003 à 10:45:42

---------------
Il n'est pas nécéssaire de réussir pour persévérer.
Reply

Marsh Posté le 11-08-2003 à 10:45:18    

HelloWorld a écrit :

Faut créer un Mutex.
Un article très complet là dessus :
http://www.codeproject.com/cpp/avoidmultinstance.asp
ou si tu es pressé :
http://support.microsoft.com/defau [...] bContent=1
 
Veux-tu limiter ton appli à une instance par utilisateur ou par poste ?

.....par poste.
 
ça devrait aller avec le mutex.


---------------
Il n'est pas nécéssaire de réussir pour persévérer.
Reply

Marsh Posté le 11-08-2003 à 10:48:47    

Ca se complique alors. ca depuis XP, on peut avoir plusieurs sessions ouvertes sur un seul poste. Donc, si j'aibien compris, tu veux que si un utilisateur a déjà lancé le soft, un autre ne le puisse pas.
Les Mutex sont uniques au sein d'une même session. Pour créer un mutex qui soit visible depuis toutes les sessions, faut rajouter "GLOBAL\" devant. Le problème c'est que certaines versions de Windows (Win9x, NT4) ne tolèrent pas d'antislash dans le nom. Donc faut tester l'OS et réagir en conséquence.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 11-08-2003 à 10:53:07    

......je suis sous linux.
 
De toute façon la question de l'utilisateur ne se pose pas.
C'est une machine qui se trouve en production,
et seul un utilisateur peut se logger dessus.
Donc pas de problème pour cela.


---------------
Il n'est pas nécéssaire de réussir pour persévérer.
Reply

Marsh Posté le 11-08-2003 à 10:58:18    

Citation :

......je suis sous linux.


lol


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 11-08-2003 à 11:00:20    

.......zut, au moment où je me met à programmer ça....
un mutex ne peut pas être nommé ???!!!!
 
Comment je peux faire pour initialiser un même mutex
dans 2 process différents ?????


---------------
Il n'est pas nécéssaire de réussir pour persévérer.
Reply

Marsh Posté le 11-08-2003 à 11:04:21    

on a dit Linux
 
je te dirai ça ce soir, mais il faut mettre un verrour coopératif sur le fichier qui stock le PID avec fnctl
 
sinon, tu peux effectivement vérifié la liste des processus en cours (ça peut être une méthode supplémentaire)

Reply

Marsh Posté le 11-08-2003 à 11:04:21   

Reply

Marsh Posté le 11-08-2003 à 11:08:46    

il n'y a pas simplement des fichiers spéciaux
que l'on ne peut ouvrir qu'une seule fois?
Lorsque le programme se termine,
le fichier serait automatiquement fermé.
 
....je pensais que c'était le cas pour le port série.


Message édité par warp le 11-08-2003 à 11:09:01

---------------
Il n'est pas nécéssaire de réussir pour persévérer.
Reply

Marsh Posté le 11-08-2003 à 11:13:40    

ça je sais pas. moi je connais une manière générique, c'est tout. sinon, tu peux utiliser un segment de mémoire partagée

Reply

Marsh Posté le 11-08-2003 à 11:19:23    

Taz a écrit :

ça je sais pas. moi je connais une manière générique, c'est tout. sinon, tu peux utiliser un segment de mémoire partagée


 
C ce que j'allai proposer.


Message édité par LetoII le 11-08-2003 à 11:19:29

---------------
Le Tyran
Reply

Marsh Posté le 11-08-2003 à 11:30:35    

warp a écrit :

réponse à rufo : pourquoi pas,
mais dans mon cas je fais plusieurs fork,
donc j'ai plusieurs process qui portent le même nom.
 
.....je peux aussi compter ces process,
mais faut que je vérifie qu'il n'y a pas de fork qui se font de temps en temps.....


 
oui mais ces processus créés par un fork sont créés par ton processus père. C'est donc lui dont il faut lister ne nb de processus de ce "type"...

Reply

Marsh Posté le 11-08-2003 à 11:42:37    

Mais comment reconnaitre leprocessus père ?
Les processus fils portent automatiquement le même nom.


---------------
Il n'est pas nécéssaire de réussir pour persévérer.
Reply

Marsh Posté le 11-08-2003 à 11:47:35    

warp a écrit :

Mais comment reconnaitre leprocessus père ?
Les processus fils portent automatiquement le même nom.

getppid()

Reply

Marsh Posté le 11-08-2003 à 11:59:36    

Taz a écrit :

getppid()

Merci bien,
mais ce n'est pas le contexte.
 
Comment reconnaitre avec la commande 'ls'
qui est le process père.
En principe celui qui a le pid le plus bas,
mais bon ça devient tout doucement compliqué,
et puis ce n'est pas infaible.
Si les pid font le tour, on recommence au pid 0.....enfin pas le 0 justement, mais bon.
Donc le père aura un pid supérieur aux fils.
 
C'est quoi le principe de la mémoire partagée ?
Je viens d'essayer avec un sémaphore,
mais celui-ci n'est pas supprimé lorsque je fais un Ctrl-C.
C'est pareil avec la mémoire partagée.


---------------
Il n'est pas nécéssaire de réussir pour persévérer.
Reply

Marsh Posté le 11-08-2003 à 12:26:11    

OK trouvé,
 
j'ouvre un fichier et je place un lock dessus.
Bizaremment un lock en écriture ne fonctionne pas,
il faut placer un lock en lecture.
 
Ainsi si le programme quitte inopinément,
le descripteur sur le fichier est détruit,
et le lock aussi par la même occasion.


---------------
Il n'est pas nécéssaire de réussir pour persévérer.
Reply

Marsh Posté le 11-08-2003 à 12:28:22    

correct. voir ma première réponse.

Reply

Marsh Posté le 11-08-2003 à 12:29:48    

Taz a écrit :

correct. voir ma première réponse.

Tout à fait,
c'est toi qui m'as mis sur la voie.
 
Il m'a fallu tout ce temps
à cause du lock en écriture et non en lecture.
 
 :hello:


---------------
Il n'est pas nécéssaire de réussir pour persévérer.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed