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 :

Traitant de signaux dans une classe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Par défaut Traitant de signaux dans une classe
    Bonjour,

    Voilà, j'aurais besoin à l'intérieur d'une classe de faire un traitant de signaux car celui-ci doit avoir accès aux attributs. Seulement, si je déclare le traitant comme une méthode de la classe, le typage n'est pas respecté (pour la structure sigaction).

    Je voudrais savoir comment je peux m'arranger ... est-ce que passer par une fonction static prenant en paramètre un pointeur sur this et renvoie la méthode de traitant semble judicieux (ça fait un peu "cuisine" quand même) ?

  2. #2
    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
    Par défaut
    Salut,
    Ca fait un peu cuisine mais il faut mettre la main dans la tambouille à partir du moment où ton interface est en C et demande explicitement un pointeur de fonction. F.A.Q : Pourquoi ne peut-on pas passer une fonction membre là où on attend un pointeur de fonction ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Ca fait un peu cuisine mais il faut mettre la main dans la tambouille à partir du moment où ton interface est en C et demande explicitement un pointeur de fonction. F.A.Q : Pourquoi ne peut-on pas passer une fonction membre là où on attend un pointeur de fonction ?
    Oui je l'avais lu ce paragraphe dans la F.A.Q, c'est pour ça que je voulais partir sur cette solution ...

    Seulement, un traitant de signal renvoie void et prend un int. Or cette solution me propose de passer par une fonction renvoyant void * et prend void *. Je ne peux donc pas, à l'intérieur de mon traitant, réinterpréter un pointeur car je ne peux pas lui donner en paramètre ...

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Les signaux posix ne permettent pas de passer un contexte. Mais d'un autre côté, ils sont destinés (au mieux) à un thread (souvent plutôt un processus), pas à un objet en particulier.

    Si c'est pour de la communication inter-thread, je te suggèrerai bien de revoir le mécanisme si tu peux pour utiliser autre chose (file d'attente, par exemple). Si c'est pour de l'inter-process, pas d'autre choix que de gérer toi-même un contexte (variable statique ?)

  5. #5
    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
    Par défaut
    Salut,
    Comme le dit white_tentacle, pas d'autres choix que de passer par une variable statique à un moment donnée.
    Ceci dit pour éviter de multiplier les variables globales si tu dois avoir plusieurs gestions de signaux et afin de mieux isoler cette gestion, tu pourrais construire une enveloppe C++ à tes signaux en passant par un std::function (ou boost::function). Ceci te permet de passer ensuite des objets plus évolués à ton enveloppe : lambda, std/boost::bind, etc.

  6. #6
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Comme le dit white_tentacle, pas d'autres choix que de passer par une variable statique à un moment donnée.
    Ceci dit pour éviter de multiplier les variables globales si tu dois avoir plusieurs gestions de signaux et afin de mieux isoler cette gestion, tu pourrais construire une enveloppe C++ à tes signaux en passant par un std::function (ou boost::function). Ceci te permet de passer ensuite des objets plus évolués à ton enveloppe : lambda, std/boost::bind, etc.

    Pour faire communiquer des process entre eux, il y'a aussi les IPC (pipe,fifo, mémoire partagée, sémaphore)

    http://www.linux-kheops.com/doc/man/...an5/ipc.5.html
    http://developers.sun.com/solaris/ar...med_pipes.html

    cela évite les variables statiques...

    Pour de simples signaux un sémaphore avec les bonnes propriétés peut suffire.

    Il m'est arrivé, par exemple, de faire bloquer un process à son démarrage sur un sempaphore pour qu'il attende qu'un autre process qui initialisait le système lui donne le "go" de départ.


    Ne pas oublier que l'origine du sémaphore est de transmettre des signaux, ce n'est pas pas hasard que les sémaphore informatique ont ce nom.
    http://www.anbg.gov.au/flags/semaphore.html

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Comme le dit white_tentacle, pas d'autres choix que de passer par une variable statique à un moment donnée.
    Ceci dit pour éviter de multiplier les variables globales si tu dois avoir plusieurs gestions de signaux et afin de mieux isoler cette gestion, tu pourrais construire une enveloppe C++ à tes signaux en passant par un std::function (ou boost::function). Ceci te permet de passer ensuite des objets plus évolués à ton enveloppe : lambda, std/boost::bind, etc.
    Non ce n'est pas pour faire de la communication entre thread (je fais ça avec des pipes), c'est pour intercepter le signal SIGPIPE qui peut survenir lorsqu'un socket est détruit pendant une communication. Et comme c'est pour l'embarqué, je n'ai pas envie qu'il plante mon programme, du coup je dois lui donner un traitant particulier.

    Finalement, je suis passé par un flag global et je définis la partie de code à l'endroit où peut survenir l'erreur. Un peu bidouille, mais bon ça marche !

  8. #8
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Ce serait SO_NOSIGPIPE pour setsockopt, je l'ai vu sur des page de man pour solaris et mac os mais pas sur celle linux

    par contre pour send tu as un champ flag avec lequel tu peux jouer, en positionnant MSG_NOSIGNAL par exemple.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    Ce serait SO_NOSIGPIPE pour setsockopt, je l'ai vu sur des page de man pour solaris et mac os mais pas sur celle linux
    C'est dommage, je suis justement sous Linux ...

    Citation Envoyé par jabbounet Voir le message
    par contre pour send tu as un champ flag avec lequel tu peux jouer, en positionnant MSG_NOSIGNAL par exemple.
    Ah ça c'est vraiment bien, ça économise des lignes et ça fait propre Merci beaucoup pour cette info jabbounet !

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/07/2005, 23h10
  2. classe dans une classe ?
    Par tut dans le forum UML
    Réponses: 23
    Dernier message: 25/06/2004, 15h00
  3. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15
  4. Thread dans une classe ?
    Par Sephi dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 07/03/2004, 18h16
  5. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/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