IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Vérifier si un programme est ouvert et l'utiliser


Sujet :

C

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 598
    Points : 7 837
    Points
    7 837
    Par défaut Vérifier si un programme est ouvert et l'utiliser
    Bonjour

    J'aimerai que si j'ouvre à nouveau un programme, ce soit le même programme déjà ouvert qui réponde à la place.
    Comme firefox ou openoffice qui n'ouvre pas une nouvelle instance si par un lien quelconque j'ouvre un fichier qui s'adresse à eux( .html pour le premier ou .odt pour le second par exemple).

    Système : Linux et Windows
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Cherche "Single Instance Program" chez note ami Google, il y a plusieurs solutions possibles, après, cela dépend aussi de comment tu veux le faire.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 598
    Points : 7 837
    Points
    7 837
    Par défaut
    Je pense mettre un lock dans le répertoire où le programme stocke les infos pour les mémoriser d'une session à l'autre.
    Je compte aussi mettre des lock lors des ouvertures des fichiers de travail utilisés par mon programme afin de ne les ouvrir qu'une fois.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 378
    Points : 23 674
    Points
    23 674
    Par défaut
    Le plus propre sous UNIX est de déposer un fichier dans /var/lock, qui sert à cela. Le fichier peut être vide ou contenir le PID de l'application. Ce PID peut aussi faire partie du nom du fichier. Idéalement, tu peux aussi créer un socket UNIX nommé de la même façon dans /tmp ou /var/run qui permette de communiquer avec l'application si elle est ouverte.

    L'inconvénient de ces méthodes est que, dans les deux cas, le ménage ne se fait pas tout seul si l'application a été tuée brutalement. Il faut donc vérifier si le PID existe toujours, s'il correspond toujours à ladite application ou, le cas échéant, faire le ménage en lançant la nouvelle instance.

    Par contre, de grâce, n'utilise pas un port réseau TCP ou UDP pour le faire, comme cela s'est déjà vu sur des applications professionnelles. C'est plus que sale vu de l'extérieur (ton admin système risque de te tuer) et ton application sera impossible à faire tourner sur serveur mutualisé, voire même sur PC avec deux sessions ouvertes.

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 598
    Points : 7 837
    Points
    7 837
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Idéalement, tu peux aussi créer un socket UNIX nommé de la même façon dans /tmp ou /var/run qui permette de communiquer avec l'application si elle est ouverte.
    Cette méthode me conviendrait tout à fait si je savais faire !
    Il va falloir que je trouve une doc en français pour apprendre à faire
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    sinon, avec getpid, et sous unix en faisant un ps -ef et en lisant la chaine..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 598
    Points : 7 837
    Points
    7 837
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    sinon, avec getpid, et sous unix en faisant un ps -ef et en lisant la chaine..
    Ceci m'informera de la présence active du programme dans la mémoire. Mais comment lui passer un message s'il tourne ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 378
    Points : 23 674
    Points
    23 674
    Par défaut
    Hello,

    Citation Envoyé par souviron34 Voir le message
    sinon, avec getpid, et sous unix en faisant un ps -ef et en lisant la chaine..
    Non, ce n'est vraiment pas propre. Un socket UNIX à la bonne place éventuellement flanqué d'un SSID unique si l'on craint vraiment les collisions suffira à remplir toutes les conditions…

    Citation Envoyé par troumad Voir le message
    Cette méthode me conviendrait tout à fait si je savais faire !
    Il va falloir que je trouve une doc en français pour apprendre à faire
    Les sockets UNIX se gèrent exactement de la même façon que les sockets réseau Internet, à ceci près que tu utiliseras la famille AF_UNIX plutôt que AF_INET et que tu passeras un nom de fichier avec son chemin plutôt qu'une adresse IP.

    Ensuite, tu te « connectes » à ce nom de fichier comme tu te connecterais à un port réseau habituel. Par contre, le nom de fichier aura été ajouté au filesystem et ne disparaîtra pas automatiquement si le processus meurt. Il faudra donc penser à faire le ménage en sortant et/ou éliminer ces sockets morts au lancement d'une instance.

  9. #9
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 598
    Points : 7 837
    Points
    7 837
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Les sockets UNIX se gèrent exactement de la même façon que les sockets réseau Internet, à ceci près que tu utiliseras la famille AF_UNIX plutôt que AF_INET et que tu passeras un nom de fichier avec son chemin plutôt qu'une adresse IP.
    Il faudra donc trouver une doc sur la gestion des sockets réseau Internet

    Mon but en faisant ce programme est d'apprendre des choses ! Je crois que je suis sur la bonne voie !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 378
    Points : 23 674
    Points
    23 674
    Par défaut
    Citation Envoyé par troumad Voir le message
    Il faudra donc trouver une doc sur la gestion des sockets réseau Internet
    Un truc comme ça, quoi :

    http://c.developpez.com/cours/?page=divers-c#reseau-c

    Attention, toutefois, l'API des sockets est très fouillis de prime abord. C'est plus simple si on connaît leur histoire et leur raison d'être.

  11. #11
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 121
    Points
    28 121
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Attention, toutefois, l'API des sockets est très fouillis de prime abord. C'est plus simple si on connaît leur histoire et leur raison d'être.
    C'est encore pire si on doit gerer IPv6

    Sinon, l'ouverture d'une socket est la seule solution reellement propre, car c'est la seule solution qui ne laisse pas de trace en cas de crash du programme. Toutes les autres solutions necessitent des verifications sur la presence du programme en plus du lock (en cas de crash, le fichier de lock reste).
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 378
    Points : 23 674
    Points
    23 674
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Sinon, l'ouverture d'une socket est la seule solution reellement propre, car c'est la seule solution qui ne laisse pas de trace en cas de crash du programme. Toutes les autres solutions necessitent des verifications sur la presence du programme en plus du lock (en cas de crash, le fichier de lock reste).
    Même chose pour un socket UNIX, comme dit plus haut : le fichier correspondant doit également être nettoyé à la main… MAIS il reste hors de question d'utiliser un socket réseau à la place.

  13. #13
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 121
    Points
    28 121
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    MAIS il reste hors de question d'utiliser un socket réseau à la place.
    Sauf si ton application doit pouvoir etre jointe de l'exterieur.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  14. #14
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 378
    Points : 23 674
    Points
    23 674
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Sauf si ton application doit pouvoir etre jointe de l'exterieur.
    Dans ce cas, ce n'est plus le même problème (relis bien le fil).

    Si ton application doit pouvoir être jointe de l'extérieur, c'est que c'est en soi une application réseau. Dans ce cas, il y faut choisir un port dédié, etc. et faire une vraie gestion des connexions. Et dans ce cas, évidemment, il est inutile de faire un lock en parallèle à cette connexion.

    Toutefois, si ton application concerne uniquement les fichiers (philosophie UNIX) et qu'elle est partagée à travers le NFS, ce sont bien des sockets UNIX qu'il faut créer. Sockets qui, eux, seront partagées vers l'extérieur par le NFS et pas par l'application elle-même.

  15. #15
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 598
    Points : 7 837
    Points
    7 837
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Dans ce cas, ce n'est plus le même problème (relis bien le fil).
    Tu as bien raison !
    Le seul but est que le programme ne soit ouvert qu'une fois, même si il édite plusieurs fichiers simultanément.

    Il me tarde d'avoir le temps de regarder comment faire tout ça !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  16. #16
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 598
    Points : 7 837
    Points
    7 837
    Par défaut
    On y parle même de socket Windows !
    Je commence à regarder
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  17. #17
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 378
    Points : 23 674
    Points
    23 674
    Par défaut
    Citation Envoyé par troumad Voir le message
    On y parle même de socket Windows !
    Je commence à regarder
    Sous Windows, les sockets fonctionnent un peu différemment. Quitte à faire de la programmation Windows en particulier, il y a d'autres moyens de savoir si une application est déjà lancée. De même que si on se cantonne à Linux, on peut faire les choses différemment, également.

    Il y a aussi une option à explorer : DBus (ou autres dæmons de communication du même genre). L'ennui est que tu ne peux pas exiger du système cible qu'il propose ce genre de choses. Par contre, si tu travailles dans un environnement réputé proposer ces facilités, c'est peut-être la meilleure approche à adopter. Cela dit, ce n'est probablement pas plus facile que de créer un socket

  18. #18
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 598
    Points : 7 837
    Points
    7 837
    Par défaut
    Je fais un programme pour Linux ET Windows !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  19. #19
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 598
    Points : 7 837
    Points
    7 837
    Par défaut
    Je viens de regarder un peu la gestion des sockets. Il y a plein de choses dans plein d'aide. Mais aucune n'est faire comme j'aimerai la trouver. Je ne vais pas me taper une autre publication pour avoir le document dont j'ai besoin ?

    Le système en dehors de toute fonction C semble ressembler à ça :
    - Un programme en boucle (infinie) qui attend qu'on l'appelle : le serveur. La boucle infinie me gène car il va falloir que j'apprenne une autre notion : faire tourner un petit programme à côté du programme principal (peut-être que gtk gère ça ?).
    - Un autre programme qui regarde s'il y a un socket pour récupérer son message et si besoin lui répondre : le fils.

    Après, il va falloir que je teste pour voir tout ça. Mais, je n'ai trouvé aucun exemple simple avec AF_UNIX (ni plus compliqué d'ailleurs) pour me permettre de comprendre le fonctionnement. Ça m'aurait servi de première pierre de construction à la compréhension du système. J'espère bien avoir le temps de tester cette semaine, mais aujourd'hui, le beau soleil m'a fait quitter mon PC

    Mais ceci ne marchera que pour Linux ? POur Windows, il va falloir que je cherche autre chose ? Il n'y a rien de commun pour les deux à ce niveau ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  20. #20
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    MAIS il reste hors de question d'utiliser un socket réseau à la place.
    pourquoi ?
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Vérifier que le programme est ouvert
    Par Loenix dans le forum Programmation multimédia/Jeux
    Réponses: 2
    Dernier message: 14/05/2009, 15h50
  2. Vérifier si un programme est ouvert
    Par wonderboutin123 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/02/2008, 11h36
  3. Vérifier si calc windows est ouverte ou pas???
    Par electrosat03 dans le forum Contribuez
    Réponses: 4
    Dernier message: 10/03/2006, 19h28
  4. Vérifier qu'un formulaire est ouvert
    Par com800 dans le forum WinDev
    Réponses: 2
    Dernier message: 07/04/2005, 20h27
  5. Vérifier si une form est ouverte
    Par nivet dans le forum Langage
    Réponses: 6
    Dernier message: 23/11/2004, 09h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo