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 :

Instance unique d'une application portable


Sujet :

C++

  1. #1
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut Instance unique d'une application portable
    Bonjour,

    Je cherche à limiter le lancement d'une application portable à une seule instance.

    Sous windows à ma connaissance, la meilleure méthode consiste à créer un mutex nommé mais pour m'appuyer sur une bibliothèque portable de qualité j'ai regardé du côté de boost qui malheureusement ne permet pas la création d'un mutex nommé.

    D'où la question suivante : est-ce que cela est possible également sous linux ?

    Si vous avez connaissance d'une méthode, si possible autre que le lock d'un fichier, je suis tout ouïe
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  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
    Il me semble que sous linux, le premier paramètre à semget() est un identifiant de semaphore arbitrairement choisi par l'utilisateur.

    D'accord, ce n'est pas un nom mais c'est un nombre.

    Peut être que tu peut prendre les 4 premiers caractère du nom de ton sémaphore pour créer cet identifiant. Voire même faire un hash sur ce nom pour calculer cet identifiant.

    il va falloir jouer du #ifdef si tu veux un code compilable quelque soit la cible
    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
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    dans le même ordre d'idée, comment faire communiquer 2 processus sous linux ?

    avec semget également pour récupérer le sémaphore créé par l'un des processus ? et ce afin que les 2 processus partagent le même sémaphore ?

    si je ne trouve rien qui couvre cela de manière portable il faudra que je suive ta suggestion et m'y coller à grand coups de conditions de compilation

    merci pour ton aide ram-0000, je vais commencer par me reseigner plus en détail sur semget et tourner autour, voir si je trouve d'autres infos
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    Bonjour,

    Je cherche à limiter le lancement d'une application portable à une seule instance.
    wxWidget offre une classe pour cela wxSingleInstanceChecker. Mais elle est déclinée en 2 versions: sur windows, c'est effectivement un mutex, sur unix, j'ai cru comprendre qu'elle utilise un fichier.

  5. #5
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    j'hésite à utiliser le système de fichier (lockfile)
    c'est peut-etre la solution la plus simple et portable
    à voir si elle présente des inconvénients
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Bah si l'application plante sans détruire le lock, il est nécéssaire de le faire sauter à la main.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    En survolant la version wxWidget, j'ai cru comprendre que le premier process inscrit son PID dans le fichier. Ce qui peut permettre de vérifier s'il existe un process avec le même PID en cours et sinon de considérer comme 'mort accidentellement' et de pouvoir gérer le cas où l'appli plante sans avoir à supprimer le fichier à la main.
    J'y vois une autre limitation: lancement de l'appli à partir d'un CD avec aucun droit d'écriture sur le poste. Là, on ne sais plus créer ce fichier.

  8. #8
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    J'y vois une autre limitation: lancement de l'appli à partir d'un CD avec aucun droit d'écriture sur le poste. Là, on ne sais plus créer ce fichier.
    Là, il suffit de créer le fichier dans une zone accessible par tous.
    Sous Un*x, typiquement /tmp, sous windows aucune idée mais ca devrait se trouver.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  9. #9
    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 Davidbrcz Voir le message
    Là, il suffit de créer le fichier dans une zone accessible par tous.
    Sous Un*x, typiquement /tmp, sous windows aucune idée mais ca devrait se trouver.
    Le répertoire pointé par la variable d'environnement TEMP ou TMP
    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
    .

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Hello,

    Les fichiers de lock sont une technique répandue sous Unix, BSDs compris, sous Linux. Il y a un répertoire de dépot attitré : /var/lock. Il sert à ça et est défini pas le FHS (pitié : pas dans /tmp). Il ne faut pas hésiter à l'utiliser car les administrateurs système les connaissent et vont les chercher à cet endroit si une application ne démarre pas (c'est mieux avec un message d'erreur, quand même).

    Sinon, il existe aussi les futex Linux mais je ne les ai jamais utilisés.

    Enfin, il existe une solution alternative au fichier de lock ordinaire : le socket UNIX. Le point de communication est un nom de fichier (et pas un port réseau, ce qui est atroce mais néanmoins répandu), et doit être effacé manuellement par l'application ou l'administrateur, comme un fichier ordinaire, mais au moins on peut communiquer avec l'application qui est derrière et vérifier qu'elle répond.

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    dans le même ordre d'idée, comment faire communiquer 2 processus sous linux ?
    Cas d'école. Ce sont des techniques que l'on regroupe sous le terme d'IPC (Inter-Process Communication), bien que les IPC Sys V soient une API particulière proposant sémaphores, file de messages et mémoire partagée. En gros, tu peux utiliser :

    - Le pipe. Nommé (sur le système de fichier ou non). Ça a l'air empirique comme ça, mais il ne faut pas hésiter à l'utiliser. Et même à en ouvrir plusieurs si besoin est. Se gère comme un fichier, donc il faut qu'un processus père les ouvre et en fasse hériter ses processus fils.

    - Les IPC Sys V. Historiquement, le système de communication proposé par la dynastie des Sys V. Sémaphores, file de messages, et segment de mémoire partagée (extrêmement utile). Chaque ressource est repérée par un identifiant. Pas de problème quand celui-ci est distribué par le système, mais risque de collision si le numéro est codé en dur dans l'application (même problème que pour choisir un port TCP, par exemple). L'ennui, c'est que ces identifiants restent en mémoire et que cela brise un peu la philosophie « tout est fichier » d'UNIX.

    - Les sockets. C'est initialement la réponse de BSD à ce même problème. C'était censé être un système de communication universel, ce qui explique un peu le fouillis de l'API consacrée. Du côté processus, un socket est repéré par un descripteur de fichier, de l'autre côté, ce socket peut-être relié à n'importe quel point de communication sur lequel on pourra se connecter. Ça peut être un port réseau, une entrée sur le filesystem, et c'est à peu près tout en l'état actuel des choses.

    - Les signaux : kill est un truc qui se rapproche de l'interruption logicielle. Ça préempte ou/et interrompt un processus en cours qui appelle alors un handler dédié. Ça sert en principe à gérer les évenements du système (interruption de l'utilisateur, pipe cassé, division par zéro, segfault, échéance d'un timer système, etc), mais il a aussi les signaux SIGUSR1 et SIGUSR2, soit des signaux « utilisateurs » qui, par défaut, ne font rien. Évidemment, les signaux ne servent pas à faire du message-passing directement (c'est un peu violent). Par contre, c'est un excellent moyen de prévenir le processus qu'il y a quelque chose à aller lire ou chercher. De nombreuses applications (Apache, par exemple), relisent leur fichier de configuration quand elles reçoivent ce signal.

    - Le fichier. C'est vrai pour les systèmes. C'est pas forcément souhaitable mais une quantité de données peut très facilement être déposée dans un fichier par un processus puis lue par un autre. En ce sens, ça rentre dans le cadre de la communication inter-processus.

  12. #12
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    je crois que la librairie QT propose des mutex nommés.

  13. #13
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Regarde du côté de Boost.Interprocess. Ça supporte tout et de manière portable.
    Shared memory, Memory mapped file, Process-shared mutex types, Process-shared semaphore, Process-shared condition, File lock, Message queue, Named mutex, Named semaphore, Named condition...
    Boost ftw

  14. #14
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Regarde du côté de Boost.Interprocess. Ça supporte tout et de manière portable.
    [...]
    Named mutex
    Perfect, well done, merci

    j'était passé à côté en me limitant à boost::threads
    j'ai remplacé mon mutex nommé "win32" en boost::named_mutex et c'est nickel

    merci loufoque
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

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

Discussions similaires

  1. [Débutant] Instance unique d'une application
    Par xarkam dans le forum C#
    Réponses: 4
    Dernier message: 19/10/2013, 11h51
  2. Réponses: 6
    Dernier message: 06/06/2009, 23h55
  3. Lancer un et un seul thread unique dans une application web
    Par rach375 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 22/09/2006, 15h35
  4. [VB] Instance unique d'une application
    Par Mimoza dans le forum Windows Forms
    Réponses: 8
    Dernier message: 19/06/2006, 17h51
  5. Réponses: 4
    Dernier message: 13/12/2005, 09h01

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