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 :

lancement de processus et vérification d'execution


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut lancement de processus et vérification d'execution
    Bonjour,

    Je développe un editeur qui ouvre des fichiers en onglets. Mon but est de faire que lorsque l'application est déjà lancée, qu'on l'appelle pour ouvrir un fichier, ce fichier soit ouvert dans l'application (l'instance) déjà en cours.

    J'utilise les sockets pour la communication entre les processus, le méchanisme fonctionne à un détail prêt: comment savoir que l'application est déjà lancée ?

    Hypothèses de départ:
    - essayer de trouver une solution portable (linux/win/mac), au pire des cas utiliser les ifdef par OS
    - C++, gtk, stl et glib

    Voici à quoi j'ai pensé (ou lu, je n'invente rien)

    - le port (prédéfini) est-il déjà occupé lors de la création de la socket ?
    Ca oblige à connecter la socket sur un numéro de port fixe, si un autre développeur a fait son appli sur le même que moi, et que son application est lancée, je suis bloqué... Question de probabilités, mais c'est pas très joli non ?

    - fichier de lock temporaire ?
    Mon fichier sera-t-il bien supprimé en cas de crash(hm) ou autres cas d'arrêts ?

    - Regarder la liste des processus ?
    Pas très portable ni élégant, mais ça devrait marcher à tous les coups...

    Quel est votre avis là-dessus ?

    Merci

  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
    Avec un mutex ?

    Dans la FAQ, tu as un exemple de mutex qui empêche de lancer une 2eme instance de la même application, ton problème n'est pas si loin.
    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
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    Effectivement ça ressemble à mon problème.

    Je n'ai pas tout compris sur la partie mutex. Il me semble qu'il s'agit de gérer différent processus lancé par un même programme et non plusiers lancements d'un même programme ? (j'ai peut-être mal interprété le code, c'est très possible)

    1) Le mutex est un membre de la classe, comment peut-il être partagé entre deux instances de l'application ? Quand je lance mon programme, je passe par un main(). Si je le relance je passe encore par le main, mais je n'ai pas de référence commune à un object mutex
    >> A moins d'avoir une zone partagé, je regarde actuellement les fichier mappés au cas où ça pourrait m'aider

    2) Le mutex est unlocké dans le destructeur, ce qui signifie - un peu comme la solution du fichier temporaire - qu'en cas d'arrêt intempestif ou beau crash le problème sera le même ?

  4. #4
    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
    C'est un mutex nommé. C'est à dire qu'il est hebergé par le noyau.

    La 1ere instance lancée créé le mutex et tente de le prendre et réussi (normal, c'est la première).

    Le 2eme instance lancée créé le mutex, tente de le prendre et échoue puisque qu'un d'autre le possède.

    Le lien entre les 2 appli, c'est le nom du mutex.

    La fonction de base de création des mutex avec WIN32, cest CreateMutex()

    Normallement, le mutex est détruit par le noyau si plus aucune application n'a d'attachement dessus (c'est utile en cas de crash de l'appli)
    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
    .

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    mutex nommé, je connais pas... Ca a l'air super sympa, je vais faire quelques recherches En espérant que ça existe aussi sous linux, ça semble parfait.
    Je reviens pour les infos, merci

  6. #6
    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
    Sous Linux, les mutex ne sont pas nommé avec une chaine de caractères mais ils sont identifiés avec un nombre, c'est donc presque pareil.

    Il suffit que les 2 applis connaissent l'identifiant de ton mutex et le tout est joué.

    regarde du côté de semget(), semop() et semctl().
    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
    .

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    Oui, j'ai été lire quelques docs, ça a l'air vraiment bien, une solution pratique et élégante J'avais déjà vu ce principe en fait, mais ça fait tellement looongtemps que je ne m'en serai jamais rappelé !

    J' ai pas encore été voir la possibilité, mais j'ai eu une autre idée hier, sur le principe des sockets. Si je peux savoir le nom de l'application qui occupe un port donné (je dois différencier le cas où je suis déjà lancé et que j'ai déjà pris ce port pour ma socket, et le cas où quelqu'un d'autre à déjà pris ce port), ça peut être une autre solution. Je vais aussi chercher de ce coté là

  8. #8
    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
    Citation Envoyé par drKzs Voir le message
    ...Si je peux savoir le nom de l'application qui occupe un port donné (je dois différencier le cas où je suis déjà lancé et que j'ai déjà pris ce port pour ma socket, et le cas où quelqu'un d'autre à déjà pris ce port), ça peut être une autre solution. Je vais aussi chercher de ce coté là
    Tous les OS ne donnent pas forcémment cette information.

    AMHA, la solution à base de "sémaphore" est la bonne (tout d'abord car elle est transposable à des applications qui n'utilisent pas les socket).
    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
    .

  9. #9
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    Effectivement c'est une solution très élégante, j'ai regardé ce matin et c'est assez simple. Malheureusement je suis tombé sur ceci:

    Persistence
    POSIX named semaphores have kernel persistence: if not removed by sem_unlink(), a semaphore will exist until the system is shut down.

    http://linux.die.net/man/7/sem_overview
    ll semble donc que dans le cas d'un plantage de l'application le sémaphore soit toujours accessible, et on retombe sur le problème du fichier temporaire :/

  10. #10
    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
    Citation Envoyé par drKzs Voir le message
    ll semble donc que dans le cas d'un plantage de l'application le sémaphore soit toujours accessible, et on retombe sur le problème du fichier temporaire :/
    Il ne reste plus qu'à faire une application sans bug
    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
    .

  11. #11
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    Si seulement !

    Je vais chercher du coté des mapped file, au cas où la persistence serait différente, et vers la solution d'identification du voleur de port

  12. #12
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Salut,
    Sa fait longtemps que j'en et pas fait mais si mes souvenirs sont bon sur le plantage de ton appli le token et libre donc tu peut le reprendre ensuite tu le récupère avec une autre appli et donc il redevient occupé.

    Et si ton shm est bien fait il est inscrit dans un fichier en partage c'est le principe du semaphore en même temps

    Ce qui persiste c'est le semaphore pas l'occupation mais a vérifié

  13. #13
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    Le shm a rapport avec la mémoire partagée ou les sémaphores, je n'ai pas compris ?

    Cela dit ton message m'a donné de l'espoir, et j'ai joyeusement testé le crash Malheureusement un semaphore ouvert avec sem_open, et sans sem_unlink ou sem_destroy (pour cause de vilain plantage bouuh) reste locké (errno : déjà existant ou ressource lockée selon le test) reste ouvert snifff :'(

  14. #14
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    au temps pour moi concernant shm, tu parles des sémaphores system V (je n'avais pas lu le lien), moi je souhaite rester avec des appel POSIX

  15. #15
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bah sinon c'est pas super mais bon tu enregistre le pid de ton appli qui tourne dans un txt ou autre.
    Et après tu vérifie dans l'autre processus si l'id existe si c'est le cas bah tu bloque sinon tu le lance.

  16. #16
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    et oui et oui, c'est pas très joli mais c'est simple et efficace, et je n'y avais pas pensé Je crois que je vais me rabattre sur cette solution merci !

    Dommage, les sémaphores c'était si joli

  17. #17
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    Je reviens juste pour clore, juste quelques ifdef entre linux et mingw, mais ça marche

    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/06/2012, 13h57
  2. Réponses: 10
    Dernier message: 02/01/2012, 10h27
  3. [Runtime] Lancement de processus
    Par Nalfeim dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 20/03/2009, 05h38
  4. Service Windows et lancement de processus
    Par sharpmao dans le forum Windows
    Réponses: 5
    Dernier message: 15/04/2006, 23h48
  5. Lancement de processus avec priorité
    Par GMI3 dans le forum Administration système
    Réponses: 2
    Dernier message: 14/06/2004, 16h43

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