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

Threads & Processus C++ Discussion :

SIgnal Handler en cpp


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Par défaut SIgnal Handler en cpp
    Bonjour,

    Je travaille sous linux (ubuntu) et je cherche à créer une classe permettant d'accéder au données d'un port COM en c++.

    J'ai donc créé ma classe mais lors de l'implémentation de la classe qui va traité les signaux j'ai un souci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     __sigset_t t;
        saio.sa_handler = Signal_handler_IO; //// PROBLEMES
        saio.sa_mask = t;
        saio.sa_flags = 0;
        saio.sa_restorer = NULL;
        sigaction(SIGIO,&saio,NULL);

    Je voudrais faire en sorte que la fonction Signal_handler_IO soit friend de la classe pour pouvoir modifier ces arguments mais je n'y arrive pas.
    Peut-on passer un argument au signal handler pour lui mettre la classe en argument?

    J'ai vu que l'on pouvait utiliser à la place de sa_handler, sa_sigaction qui avait des arguments différents:

    void (*sa_sigaction) (int, siginfo_t *, void *);

    Est-ce que dans l'argument void * je peux passer ma classe?
    J'ai essayé mais sans succés pour le moment...

    Si quelqu'un à une idée pour résoudre mon problème.

    D'avance merci.

  2. #2
    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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Pourquoi ne pas utiliser du code déjà existant pour gérer le port série ?

    Cest pas ce qu'il manque. ya même eu une proposition de source récemment ici même.
    "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)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Par défaut
    Le seul code que j'ai trouvé etait réalisé en c et pas en cpp.

    En plus par soucis de programmation je voudrais que le traitement soit réalisé sur un cpu spécifique.

  4. #4
    Membre chevronné
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Par défaut
    Salut,

    Citation Envoyé par bird12358 Voir le message
    Peut-on passer un argument au signal handler pour lui mettre la classe en argument?
    Non.
    On ne peut pas passer d’argument à un signal handler.


    Citation Envoyé par bird12358 Voir le message
    J'ai vu que l'on pouvait utiliser à la place de sa_handler, sa_sigaction qui avait des arguments différents:

    void (*sa_sigaction) (int, siginfo_t *, void *);

    Est-ce que dans l'argument void * je peux passer ma classe?
    Non, tu ne peux pas.
    Citation Envoyé par man 2 sigaction
    If SA_SIGINFO is specified in sa_flags, then sa_sigaction (instead of sa_handler) specifies the signal-handling function for signum. This function receives the signal number as its first argument, a pointer to a siginfo_t as its second argument and a pointer to a ucontext_t (cast to void *) as its third argument. (Commonly, the han dler function doesn't make any use of the third argument. See getcontext(2) for further information about ucontext_t.)

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Par défaut
    Comment puis-je faire alors pour effectuer dans le signal_handler des opération sur la class que j'ai implémenté? (Excepté en mettant une classe en globale ou en externe ...)

  6. #6
    Membre chevronné
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Par défaut
    Je ne pense pas que tu puisses arriver à tes fins sans passer par une globale (de toute façon, un signal handler c’est déjà un truc global).
    Et même comme ça, je ne suis pas sûr que ça soit une bonne choses…

    Il faut bien voir que le mécanismes des signaux c’est un trucs très (c’est relatif bien sûr) bas niveau. Ça n’a aucune notion de C++, de classe ou d’objet.
    De plus, ton handler peut être appelé quasiment n’importe quand et il est très facile de faire une action qui va bousiller l’état interne de ton programme.

    Du coup, la vraie question c’est : « Quel genre de code tu veux exécuter dans ton handler ? »

    Parce qu’il faut savoir qu’un signal handler c’est quelque chose qui a beaucoup de restrictions (et des restrictions strictes, du genre que si tu joues à ne pas les respecter c’est un undefined behavior qui va te tomber dessus très vite et un crash dans le meilleur des cas)
    Au final tu n’as pas le droit de faire grand-chose dans un signal handler, par exemple seule une poignée de fonction est appelable de manière sûre dans un signal handler.
    Quelques informations à ce sujet ici et (bon ça cite des bouts de norme du C, mais je pense que ça vaut aussi pour le C++ étant donné que là ça touche plus à POSIX qu’au C en lui-même).

  7. #7
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Avec std::bind peut être ? (Je sais pas trop si bind peut retourner l'équivalent d'un pointeur de fonction)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Foo {
    	void registerSignal() {
    		__sigset_t t;
    		saio.sa_handler = std::bind(&Foo::signal_handler_IO, this); // this DOIT être valide au moment où le signal sera reçu.
    		saio.sa_mask = t;
    		saio.sa_flags = 0;
    		saio.sa_restorer = NULL;
    		sigaction(SIGIO,&saio,NULL);
    	}
     
    	void signal_handler_IO() {
     
    	}
    };
    Mais utiliser une lib qui s'occupe de la partie bas niveau et qui te fourni un stream serait bien plus simple.

Discussions similaires

  1. Gtk - Warning: Could Not Find Signal Handler
    Par shumprevers dans le forum GTK+
    Réponses: 36
    Dernier message: 04/12/2014, 14h30
  2. Erreur could not find signal handler
    Par moncef363 dans le forum GTK+
    Réponses: 4
    Dernier message: 06/06/2013, 14h08
  3. Gtk-WARNING **: Could not find signal handler
    Par yostane dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 24/11/2008, 14h07
  4. Déconnecter un signal de son handler
    Par Kicker dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 27/05/2008, 08h08

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