POSIX Que faire apres avoir attrape un signal

POSIX Que faire apres avoir attrape un signal - C - Programmation

Marsh Posté le 23-10-2003 à 16:51:00    

J'ai attrape un signal en utilisant un Signal Handler (Posix), le signale est une segmentation fault (au passage).
J'aimerai savoir ce qu'il m'est possible de faire apres avoir attrape ce signal.
Mon programme C++ est utilise dans un container (tomcat),y a des bugs dans le programme et des qu'une segmentation fault est genere, ca fait planter tout le container.
J'aimerai savoir si on peut faire terminer le programme correctement en modifiant le signal recu.
 
J'ai trouve un genre d'exemple d'utilisation de signal, mais j'arrive pas trop a comprendre ce qu'il se passe.
 
Je crois que ce qui m'interesse se passe entre la ligne 15 et 19, mais j'arrive pas a comprendre exactement ce qu'il se passe.
    ()
 
1     /* sig-posix.c */
 
  2     #include <stdlib.h>
  3     #include <signal.h>
  4     #include <errno.h>
  5     #include <unistd.h>
  6     #include <stdio.h>
 
  7     void traitement(int signum)
  8     {
  9        struct sigaction rien, ancien;
 10        
 11        printf("Signal %d => ",signum);
 12        switch(signum) {
 13         case SIGTSTP :
 14           printf("J'ai reçu un SIGTSTP.\n" );
 15           /* on désarme le signal SIGTSTP */
 16           rien.sa_handler = SIG_DFL;
 17           rien.sa_flags   = 0;
 18           sigemptyset(&rien.sa_mask);   /* rien à masquer */
 19           sigaction(SIGTSTP,&rien,&ancien);  
 20            
 21           printf("Alors je m'endors....\n" );
 22           kill(getpid(),SIGTSTP);  /* auto-endormissement */
 23           printf("On me réveille ?\n" );
 24           /* remise en route */
 
 25           sigaction(SIGTSTP,&ancien,NULL);
 26           printf("C'est reparti !\n" );
 27           break;
 28         case SIGINT :
 29         case SIGTERM :
 30           printf("On m'a demandé d'arrêter le programme.\n" );
 31           exit(EXIT_SUCCESS);
 32           break;
 33        };
 34     }
 
 35     int main(void)
 36     {
 37        struct sigaction a;
 38        int i;
 39        
 40        a.sa_handler = traitement; /* fonction à lancer */
 41        sigemptyset(&a.sa_mask);   /* rien à masquer */
 42        
 43        sigaction(SIGTSTP,&a,NULL); /* pause contrôle-Z */
 44        sigaction(SIGINT, &a,NULL); /* fin contrôle-C */
 45        sigaction(SIGTERM,&a,NULL); /* arrêt */
 46        
 
 47        for (i=1; i<60; i++) {
 48          sleep(1);  
 49          printf("%d",i%10);  
 50          fflush(stdout);  
 51        };
 
 52        printf("Fin\n" );
 53        exit(EXIT_SUCCESS);
 54     }
 


---------------
La meilleure facon d'en apprendre toujours plus, c'est de ne pas retenir ce qu'on nous dit.
Reply

Marsh Posté le 23-10-2003 à 16:51:00   

Reply

Marsh Posté le 23-10-2003 à 17:13:31    

tu fais tourner ton truc dans gdb, au moment où le signal se lève, gdb te rend la main, tu sais exactement où ça a planté, et tu peux explorer toutes tes variables.

Reply

Marsh Posté le 23-10-2003 à 17:16:52    

Merci pour l'info, mais en fait mon interet n'est pas de modifier le programme C++, juste d'essayer de faire ce que j'ai explique.
Ce n'est pas mon programme, et je ne dois pas le modifier, juste essayer de faire mon possible pour le terminer de la maniere la moins brutale.
 
Merci quand meme pour l'info.


---------------
La meilleure facon d'en apprendre toujours plus, c'est de ne pas retenir ce qu'on nous dit.
Reply

Marsh Posté le 23-10-2003 à 17:22:45    

envoies-toi un un SIGTERM ou SIGINT (control-C) alors.
kill(getpid(),SIGTERM);
ou kill(getpid(),SIGINT);

Reply

Marsh Posté le 23-10-2003 à 17:31:35    

Ouais c'est ce que j'ai essayer de faire, mais ca a pas l'air de marcher.
En fait j'utilise le programme C++ au travers d'un Grid Service, et quand j'execute le client sur le service en question, il me met un timeOut error pour ma requete...ca doit bloquer quelquepart, mais je sais pas ou....
 
Est-ce que dans la logique, ca se fait (appel du kill), et dans mon cas est-ce la meilleur chose a faire??????


---------------
La meilleure facon d'en apprendre toujours plus, c'est de ne pas retenir ce qu'on nous dit.
Reply

Marsh Posté le 23-10-2003 à 17:57:46    

la meilleur chose à faire est de corriger le C++, que ce soit toi ou un fournisseur quelconque que tu engueuleras au passage qui le fasse.

Reply

Marsh Posté le 23-10-2003 à 18:11:29    

Je sais que c'est la meilleure chose a faire.....
Mais il faut que je fasse autrement......meme si ca fait degueulasse.


---------------
La meilleure facon d'en apprendre toujours plus, c'est de ne pas retenir ce qu'on nous dit.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed