Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2911 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°483120
warp
Posté le 11-08-2003 à 10:40:12  profilanswer
 

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.
mood
Publicité
Posté le 11-08-2003 à 10:40:12  profilanswer
 

n°483129
rufo
Pas me confondre avec Lycos!
Posté le 11-08-2003 à 10:42:30  profilanswer
 

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.

n°483139
HelloWorld
Salut tout le monde!
Posté le 11-08-2003 à 10:44:00  profilanswer
 

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
n°483141
warp
Posté le 11-08-2003 à 10:44:50  profilanswer
 

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.
n°483144
warp
Posté le 11-08-2003 à 10:45:18  profilanswer
 

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.
n°483150
HelloWorld
Salut tout le monde!
Posté le 11-08-2003 à 10:48:47  profilanswer
 

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
n°483158
warp
Posté le 11-08-2003 à 10:53:07  profilanswer
 

......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.
n°483163
HelloWorld
Salut tout le monde!
Posté le 11-08-2003 à 10:58:18  profilanswer
 

Citation :

......je suis sous linux.


lol


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°483166
warp
Posté le 11-08-2003 à 11:00:20  profilanswer
 

.......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.
n°483170
Taz
bisounours-codeur
Posté le 11-08-2003 à 11:04:21  profilanswer
 

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)

mood
Publicité
Posté le 11-08-2003 à 11:04:21  profilanswer
 

n°483172
warp
Posté le 11-08-2003 à 11:08:46  profilanswer
 

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.
n°483178
Taz
bisounours-codeur
Posté le 11-08-2003 à 11:13:40  profilanswer
 

ç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

n°483186
LetoII
Le dormeur doit se réveiller
Posté le 11-08-2003 à 11:19:23  profilanswer
 

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
n°483201
rufo
Pas me confondre avec Lycos!
Posté le 11-08-2003 à 11:30:35  profilanswer
 

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"...

n°483211
warp
Posté le 11-08-2003 à 11:42:37  profilanswer
 

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.
n°483219
Taz
bisounours-codeur
Posté le 11-08-2003 à 11:47:35  profilanswer
 

warp a écrit :

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

getppid()

n°483254
warp
Posté le 11-08-2003 à 11:59:36  profilanswer
 

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.
n°483295
warp
Posté le 11-08-2003 à 12:26:11  profilanswer
 

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.
n°483297
Taz
bisounours-codeur
Posté le 11-08-2003 à 12:28:22  profilanswer
 

correct. voir ma première réponse.

n°483300
warp
Posté le 11-08-2003 à 12:29:48  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Système de couleurs personalisées avec JS compatible Mozilla [résolu][PHP/SGDB] Lancer un script à un interval régulièrement
[Résolu] Impossible d'exécuter des javascript[C] Keyboard hook pour linux
Time Format [Resolu][Résolu] formulaire => données envoyés à fonction php ?
[Shell] comment lancer une connexion internet??Lire un fichier .wav ou .mp3 en C ou C++ sous Linux
executer du code 1 fois sur deux dans un while[Résolu] formulaire => données envoyés à fonction php ?
Plus de sujets relatifs à : [linux] empêcher un programme de se lancer plusieurs fois : résolu


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR