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 :

gestion des signaux


Sujet :

C

  1. #1
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut gestion des signaux
    Bonjour,

    j'utilse une gestion des signal classique comme ci-dessous pour intercepter des signaux d'erreurs dans mon code. J'essaye en vain un moyen dans ma fonction handle_siganl un moyen de connaitre la fonction d'orrigine du signal, ici par example "func_test".
    Je ne pense pas qu'il est y ait un moyen, mais au cas ou quelqu'un aurait déjà fait ca, je suis preneur.
    Merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
     
    void handle_signal(int param)
    {
      std::string err,err2;
      err="Critical system error : ";
      err2="Unknow error\n";
      if (param==2)  err2="Interactive attention\n";
      if (param==4)  err2="Illegal instruction\n";
      if (param==8)  err2="Floating point error\n";
      if (param==11) err2="Segmentation violation\n";
      if (param==22) err2="Abnormal termination (abort)\n";
     
      printf("%s\n",err.c_str());
    }
     
    //-------------------------------------------------------------------------
    void func_test()
    {
      raise(SIGSEGV);
    }
     
    int main(int argc, char *argv[])
    {
      signal (SIGILL, handle_signal);
      signal (SIGFPE, handle_signal);
      signal (SIGSEGV,handle_signal);
      ..
      .
      // suite du code
     func_test();
      ...
    }

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Ce code est incomplet, mal écrit, et c'est tout sauf du C. Voici un exemple d'utilisation correcte des signaux en C. Quel est ton système ?

  3. #3
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Ok ok, j'ai mixé un peu de c++, mais là t'es peut-être un peu excessif...
    Ton lien est similaire à ce que j'ai ecrit mais surtout ne répond pas à ma question initiale.
    Sinon, je fais du gcc sous linux et windows , macOS à l'occasion

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Ok ok, j'ai mixé un peu de c++, mais là t'es peut-être un peu excessif...
    1. Il est incomplet, on ne peut pas savoir où est-ce que tu as commis une éventuelle erreur. => Poste le code complet d'un exemple minimal qui expose ton problème.

    2. Mal écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      if (param==2)  err2="Interactive attention\n";
      if (param==4)  err2="Illegal instruction\n";
      if (param==8)  err2="Floating point error\n";
      if (param==11) err2="Segmentation violation\n";
      if (param==22) err2="Abnormal termination (abort)\n";
    Qu'est-ce que 2, 4, 8, 11, 22 ? N'y a-t-il pas des defines standard (et portables) pour les représenter ? S'il en existe, => utilise-les.

    3. C'est tout sauf du C et apparemment, ce n'est pas du C++ correct non plus. Mais ça d'accord ça peut passer, c'est juste qu'il est préférable que cela soit précisé. Ne serait-ce que pour les débutants qui tombent sur cette discussion.

  5. #5
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Ok voici une version un peu plus "C", mais je ne garantis rien, à force de mélanger les 2 je ne sais plus trop ce qui est purement C ou C++
    Mais je précise que ce bout de code mal ecrit fonctionne, ce n'était pas l'objet de mon post.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <signal.h>
     
     
    void handle_signal(int param)
    {
      char err[1000];
      strcpy(err,"Critical system error : ");
      if (param==SIGINT)  strcat(err,"Interactive attention\n");
      if (param==SIGILL)  strcat(err,"Illegal instruction\n");
      if (param==SIGFPE)  strcat(err,"Floating point error\n");
      if (param==SIGSEGV) strcat(err,"Segmentation violation\n");
      if (param==SIGABRT) strcat(err,"Abnormal termination (abort)\n");
      printf("%s\n",err);
    }
     
    //-------------------------------------------------------------------------
    void func_test()
    {
      raise(SIGSEGV);
    }
     
    int main(int argc, char *argv[])
    {
      signal (SIGILL, handle_signal);
      signal (SIGFPE, handle_signal);
      signal (SIGSEGV,handle_signal);
     
      // suite du code
      func_test();  // declanchement d'un signal
      // suite du code
      return(0);
    }

  6. #6
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Ça c'est du C . Même si le code n'est pas encore parfait. Un switch ou une série de if-else serait meilleure que cette succession de if. Alors, maintenant ça marche ?

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par uriotcea Voir le message
    J'essaye en vain un moyen dans ma fonction handle_siganl un moyen de connaitre la fonction d'orrigine du signal, ici par example "func_test".
    a priori c'est impossible à cause de la manière interne dont cette fonctionalité marche...

    Les signaux marchent en effet de la manière suivante :

    Lorsque raise est appelée (directement ou à travers la bibliothèque), c'est un processus système qui le gère, ce n'est pas ton application...


    Ce processus dispatch le signal..

    Puis, tous les processus ayant sélectionné ce signal avec un signal handler le recoivent.

    Lorsque donc tu rentres dans le handler, tu ne peux pas savoir qui l'a généré, à priori... puisque ça ne vient pas de chez toi...




    Le seul moyen si tu veux faire ça c'est de te faire une variable globale et de stocker une valeur en donnant l'origine à la main...

    Ce qui pourrait donner :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #define ORIGIN_UNKNOWN         0
    #define ORIGIN_TEST_SISEGV    1
    ....
     
    statit int ORIGINE=ORIGIN_UNKNOWN ;
     
    ..
     
    void handle_signal(int param)
    {
      char err[1000];
      strcpy(err,"Critical system error : ");
     
      switch ( param )
       {
           case SIGSEV :
                sprintf(&(err[strlen(err)],"Segmentation violation in routine %d\n", ORIGINE);
                break ;
           ...
       }
      fprintf(stderr, "%s\n",err);
    } 
    //-------------------------------------------------------------------------
    void func_test()
    {
      ORIGINE = ORIGIN_TEST_SIGSEV ;
     
      raise(SIGSEGV);
    }


    ou même un peu plus rusé en te définissant une structure contenant l'adresse de la fonction et le numéro du signal...

    Mais c'est tout ce qu'on peut faire...


    PS: tu noteras que j'ai remplacé ton printf par un fprintf (stderr... En effet, C définit spécifiquement un flux spécial pour les erreurs... Quand il s'agit de faire un gestionnaire d'erreurs, il est de bonne pratique de s'en servir...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

Discussions similaires

  1. gestion des signaux des touches directionnelles
    Par sedd1991 dans le forum GTK+ avec C & C++
    Réponses: 0
    Dernier message: 01/05/2012, 18h44
  2. Gestion des signaux : SIGTSTP
    Par BSans dans le forum C
    Réponses: 1
    Dernier message: 22/12/2011, 16h17
  3. Gestion des signaux
    Par damien77 dans le forum Bibliothèque standard
    Réponses: 12
    Dernier message: 01/03/2008, 22h39
  4. gestion des signaux
    Par pimous dans le forum Linux
    Réponses: 2
    Dernier message: 20/02/2008, 14h44
  5. Gestion des signaux
    Par Kicker dans le forum Administration système
    Réponses: 4
    Dernier message: 23/05/2007, 15h40

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