Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1437 connectés 

  FORUM HardWare.fr
  Programmation
  C

  POSIX Que faire apres avoir attrape un signal

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

POSIX Que faire apres avoir attrape un signal

n°548704
scool36
Vive les Ours
Posté le 23-10-2003 à 16:51:00  profilanswer
 

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.
mood
Publicité
Posté le 23-10-2003 à 16:51:00  profilanswer
 

n°548763
nraynaud
lol
Posté le 23-10-2003 à 17:13:31  profilanswer
 

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.

n°548770
scool36
Vive les Ours
Posté le 23-10-2003 à 17:16:52  profilanswer
 

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.
n°548784
nraynaud
lol
Posté le 23-10-2003 à 17:22:45  profilanswer
 

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

n°548792
scool36
Vive les Ours
Posté le 23-10-2003 à 17:31:35  profilanswer
 

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.
n°548814
nraynaud
lol
Posté le 23-10-2003 à 17:57:46  profilanswer
 

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.

n°548826
scool36
Vive les Ours
Posté le 23-10-2003 à 18:11:29  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  POSIX Que faire apres avoir attrape un signal

 

Sujets relatifs
Signal Handler (segmentation fault)Hors Série Login : C/POSIX
[C] - Recuperer des info sur les signaux posix[QT] J'arrive pas à connecter mon signal
Probleme Thread Posix + C++cherche composant visualisation signal sonore
implémentation semaphore POSIX 1.bNorme Posix, quel unix le "moins" propriétaire
[unix/ thread Posix] petite questionport com1 interception de signal
Plus de sujets relatifs à : POSIX Que faire apres avoir attrape un signal


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR