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

Bibliothèque standard C Discussion :

Comment éviter un double lancement ?


Sujet :

Bibliothèque standard C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Points : 27
    Points
    27
    Par défaut Comment éviter un double lancement ?
    Bonjour,
    J'aimerai savoir comment on peut éviter qu'un même programme soit lancé deux fois(sous Linux). Ceci se produit par double clic voir triple clic alors qu'un suffit.
    Y a t'il une fonction(system) qui permet de savoir si le même programme à déjà été lancé ?

    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
    Citation Envoyé par oeilvert Voir le message
    Y a t'il une fonction(system) qui permet de savoir si le même programme à déjà été lancé ?
    Non mis à part peut être interroger la liste des process de la machine.

    Sinon, pour éviter cela, le 1er process créé un sémaphore ou un mutex ou une mémoire partagée que le 2eme process peux teste, s'il existe, il en déduit qu'un autre process est déjà lancé et se suicide.
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Points : 27
    Points
    27
    Par défaut
    Merci ram-0000,
    Je viens du monde des automates programmables. Mes connaissances en C sont encore basique, je ne sais pas ce que c'est un sémaphore, ni un mutex et ne sais pas comment créer une mémoire partagée. Je vais faire des recherches sur ces trois éléments...merci pour les idées

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    [Edit]

    Je ne suis pas encore un pro en développement Linux, je suis entrain de m'y former mais peut-être qu'avec un appel à getppid() pour essayer de récupérer le PID du processus père et si ce PPID est identique au PID du processus père tu détruit le processus fils.

    Enfin à ce que j'en dit... faut tester
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Sinon un peu plus archaïque, tu créés un fichier qui contient 0 si aucune instance est en cours, auquel cas tu lances le programme et 1 si une instance est déjà en cours où dans ce cas, tu arrêtes la création d'un nouveau processus
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    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 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Citation Envoyé par oeilvert Voir le message
    Comment on peut éviter qu'un même programme soit lancé deux fois(sous Linux). Ceci se produit par double clic voir triple clic alors qu'un suffit ?
    Citation Envoyé par ram-0000 Voir le message
    Mis à part peut être interroger la liste des process de la machine, pour éviter cela, le 1er process créé un sémaphore ou un mutex ou une mémoire partagée que le 2eme process peux teste, s'il existe, il en déduit qu'un autre process est déjà lancé et se suicide.
    La meilleure façon – à mon humble avis – reste d'utiliser un socket UNIX à ouvrir dans /var/run. C'est comme cela que procèdent la plupart des applications. Ça reste filesystem compliant, c'est exploitable facilement par les scripts Shell, c'est éventuellement visible à travers le NFS (même si c'est déconseillé), l'espace de nommage est par définition très vaste et, dernier point mais non des moindres, cela permet de communiquer avec ladite application si elle est effectivement déjà ouverte. Dans le cas des applications bureautiques, par exemple, ça peut servir à demander à l'instance concernée d'ouvrir elle-même le nouveau document lancé par l'utilisateur.

    Il faut juste penser à le nettoyer en sortant, et à vérifier s'il y a bien une application derrière le socket déclaré et, sinon, faire le ménage.

    Citation Envoyé par Franck.H Voir le message
    [Edit]

    Je ne suis pas encore un pro en développement Linux, je suis entrain de m'y former mais peut-être qu'avec un appel à getppid() pour essayer de récupérer le PID du processus père et si ce PPID est identique au PID du processus père tu détruit le processus fils.
    Non, ça ne fonctionnerait que si c'est le même programme qui a lancé les deux instances (probable mais pas certain dans le cas d'un double-clic, imprévisible sinon) et, de toutes façons, l'appel te donnerait l'ID de ton processus père, mais ne te permettrait pas de connaître celui du processus concerné, et encore moins d'identifier ce processus en premier lieu…

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Points : 27
    Points
    27
    Par défaut
    Merci Franck,
    Si j'ai bien compris la fonction getppid() me renvoie le PID du processus parent, mais il n'y a pas de processus parent lors d'un double lancement ou je me trompe?
    Il faudrait une fonction du genre: bool getProcess("nonduprocess");

    je pense que l'idée de ram-0000 est bonne.

  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 Franck.H Voir le message
    Je ne suis pas encore un pro en développement Linux, je suis entrain de m'y former mais peut-être qu'avec un appel à getppid() pour essayer de récupérer le PID du processus père et si ce PPID est identique au PID du processus père tu détruit le processus fils.
    Non, cela va pas le faire !!

    D'abord, cela veut dire que le process "mono instance" surveille en permanence les autres process

    Ensuite, si ce process "deuxieme instance" est un petit fils du parent du process "mono instance" (un neveu quoi !), cette méthode ne marche plus.

    autre chose, pour tuer un process, il faut des privilèges. Si les 2 process "mono instance" et "deuxieme instance" tournent avec des identités différentes, "mono instance" ne peut pas tuer "deuxieme instance" ni l'inverse d'ailleurs (à moins d'être root mais c'est une autre histoire).

    Pour en revenir à ma 1ere réponse, les objets dont je parlais (sémaphore, mutex, mémoire partagée) sont des objets IPC (comme InterProcess Communication). Ces objets sont créés par les programmes mais ce qui est important, hébergés par le noyau. C'est à dire que même si le process créateur se crash, le noyau continue à gérer les objets IPC et à les détruire si personne ne les utilise plus. De plus, ce n'est pas spécifique au langage mais c'est un concept lié à l'OS. C'est à dire qu'il est possible de créer un sémaphore en C, en Delphi ou en VBA (pour peu que l'API soit rendue disponible dans pour ces langages).

    L'algo général est
    Citation Envoyé par pseudo code
    obtention d'un sémaphore nommé (avec création si nécessaire)
    tentative de prise de ce sémaphore
    si tentative échoue
    se suicider
    fin si
    ...

    fin du programme
    libérer le sémaphore (même si le systeme le fait, c'est plus propre
    Pour ce qui est des appels systèmes à utiliser, c'est
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Points : 27
    Points
    27
    Par défaut
    oups je n'avais pas vu le post d'obsidian...

    Me voila avec plusieurs pistes....je crois que je vais attendre un peu, des fois qu'il y a d'autres idées

  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 Franck.H Voir le message
    Sinon un peu plus archaïque, tu créés un fichier qui contient 0 si aucune instance est en cours, auquel cas tu lances le programme et 1 si une instance est déjà en cours où dans ce cas, tu arrêtes la création d'un nouveau processus
    Pas bon non plus, si l'appli se crash (ou que le poste reboot) et qu'il reste 1 dans le fichier, plus personne ne peut lancer 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
    .

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Pas bon non plus, si l'appli se crash (ou que le poste reboot) et qu'il reste 1 dans le fichier, plus personne ne peut lancer l'appli.
    Ouais c'est sûr
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Au passage, un article en anglais sur les problèmes de ce genre: A single-instance program is its own denial of service
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 14
    Dernier message: 16/09/2011, 01h38
  2. Comment éviter le double envoi d'une requete?
    Par ando0098 dans le forum JSF
    Réponses: 7
    Dernier message: 07/10/2010, 17h47
  3. comment éviter un double click malheureux
    Par Godard dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/10/2010, 19h15
  4. Comment éviter le lancement automatique de CBuilder
    Par Xavier dans le forum C++Builder
    Réponses: 3
    Dernier message: 26/01/2005, 18h35
  5. Réponses: 4
    Dernier message: 28/07/2004, 11h42

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