Signal Handler (segmentation fault)

Signal Handler (segmentation fault) - C++ - Programmation

Marsh Posté le 15-10-2003 à 11:44:54    

Bonjour a tous....
Voila j'aimerai catcher un signal unix, (je crois que c'est possible avec un signal handler mais je ne sais pas du tout comment on fait).
J'ai un programme C++ qui genere une "segmentation fault".
j'aimenrai savoir commment je pourrai attraper cette petite bete.
 
Si vous avez des idees, ou des conseils pour d'autres facons de resoudre se probleme.
 
Merci...

Reply

Marsh Posté le 15-10-2003 à 11:44:54   

Reply

Marsh Posté le 15-10-2003 à 11:48:06    

man signal (pour faire simple)
 
man sigaction pour les 3l33t modernes


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 15-10-2003 à 12:04:04    

Mes question vont etre un peu con, mais :
 
1) Le signal handler ce fait en C??????
2) On peut ecrire du C dans un programme C++????

Reply

Marsh Posté le 15-10-2003 à 12:04:32    

1- oui
2- oui


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 15-10-2003 à 12:10:10    

Merci pour ton aide...

Reply

Marsh Posté le 15-10-2003 à 13:16:38    

tu ferais bien d'utiliser des bibli C++ pour faire tout ça, genre GNUCOmmonC++ ou Boost, parce que les fonctions corrompent en général pas mal de ttruc (notemment au niveau de destructeurs)

Reply

Marsh Posté le 15-10-2003 à 16:02:40    

J'essaye la methode signal donne dans "signal.h", mais y a un truc que je comprend pas:
J'ai trouve un exemple sur le net pour detecter le signal "control D" :
Le code est le suivant :
------------------------------------------------------
#include <stdio.h>      
#include <unistd.h>    
#include <signal.h>    
   
void catch_int(int sig_num)
{
    signal(SIGINT, catch_int);
    printf("Don't do that\n" );
    fflush(stdout);
}
   
int main(int argc, char* argv[])
{
    /* set the INT (Ctrl-C) signal handler to 'catch_int' */
    signal(SIGINT, catch_int);
   
    /* now, lets get into an infinite loop of doing nothing. */
    for ( ;; )
        pause();
}
------------------------------------------------------------------
Je le compile bien, il marche bien, mais ma question est : Y a pas une erreur de typage????? la fonction catch_int prend bien un  int en parametre, et on le voit pas a l'appel......
 
 
Par contre quand j'integre ce code dans mon exemple C++ il me met une erreure de typage qui est la suivante :
GT3MadCity.h:2449: no matches converting function `catch_int' to type `void (*)(int)'
 
 
Et j'aurais encore une question, ca veut dire quoi ca :    typedef void (*sighandler_t)(int);
C'est dans l'aide sur signal (man signal)..
 
Merci  
 
 
 
 
 
 
 
 
 

Reply

Marsh Posté le 15-10-2003 à 16:10:56    

En gros, il faut que tu retrouves ton cours sur les pointeurs de fonctions en C ou en C++.
 
:D
 
Sinon, une autre suggestion : un SIGSEGV en général c'est un bug à corriger, pas à intercepter. Je suggère d'aller faire un petit tour du coté de valgrind sur Google.

Reply

Marsh Posté le 15-10-2003 à 16:19:05    

Ouais mais en fait le programme C++ c'est pas moi qui l'ai fait, donc je vais pas aller mettre mon nez la dedans.
 
Et le truc qu'y a c'est que je bosse dans une equipe sur des Grids Services, et le prgramme C++ fait cracher tout le container tomcat une fois sur 10, donc si il pouvait juste s'arreter tout seul sans tout faire foirer mon boss serait content.
 
C'est pour ca, il faut que j'intercepte ce signal et que je le fasse s'arreter en douceur.
 
Si quelqu'un pouvait me renseigner ce serait :bounce: vachement bien.

Reply

Marsh Posté le 15-10-2003 à 16:25:25    

en gros c'est du C quoi ...

Reply

Marsh Posté le 15-10-2003 à 16:25:25   

Reply

Marsh Posté le 15-10-2003 à 17:07:51    

Ouais en fait c du c, c'est ca mon prbleme... non c'est bien le c mais j'en ai pas beaucoup fait.
 
Si quelqu'un pouvait tout de meme me renseignere sur ce que cela veut dire je crois ca pourrait m'aider :
GT3MadCity.h:2449: no matches converting function `catch_int' to type `void (*)(int)'  
 
Et aussi c'est quoi ce type bizarre :
typedef void (*sighandler_t)(int);  
 
Merci merci
 

Reply

Marsh Posté le 15-10-2003 à 17:12:32    

met ta fonction handler en static .... et lis le man

Reply

Marsh Posté le 15-10-2003 à 23:02:48    

je sais pas, mais pour une fois je vais être médisant comme Taz en temps normal, mais ça sens le gars qui veux cacher ses seg fault....

Reply

Marsh Posté le 15-10-2003 à 23:03:35    

scool36 a écrit :

Ouais mais en fait le programme C++ c'est pas moi qui l'ai fait, donc je vais pas aller mettre mon nez la dedans.
 
Et le truc qu'y a c'est que je bosse dans une equipe sur des Grids Services, et le prgramme C++ fait cracher tout le container tomcat une fois sur 10, donc si il pouvait juste s'arreter tout seul sans tout faire foirer mon boss serait content.
 
C'est pour ca, il faut que j'intercepte ce signal et que je le fasse s'arreter en douceur.
 
Si quelqu'un pouvait me renseigner ce serait :bounce: vachement bien.


 
autant pour moa :jap:

Reply

Marsh Posté le 15-10-2003 à 23:06:48    

scool36 a écrit :

...
Je le compile bien, il marche bien, mais ma question est : Y a pas une erreur de typage????? la fonction catch_int prend bien un  int en parametre, et on le voit pas a l'appel
......

non, y a pas d'erreur, la fonction catch_int() n'est pas appellée dans le main.

signal(SIGINT, catch_int)

installe le handler (la fonction catch_int) pour le signal SIGINT. Mais il n'y a pas d'appel de fonction à ce niveau.


Message édité par mrbebert le 15-10-2003 à 23:07:37
Reply

Marsh Posté le 15-10-2003 à 23:08:44    

et ? peut etre que mosieur fais des control+C :o

Reply

Marsh Posté le 16-10-2003 à 01:08:23    

Taz a écrit :

et ? peut etre que mosieur fais des control+C :o


 
bah il avait parlé de seg fault au début :D

Reply

Marsh Posté le 16-10-2003 à 07:56:25    

qui n'est pas SIGINT

Reply

Marsh Posté le 16-10-2003 à 15:36:08    

Le SGIINT c'etait juste pour tester si le Signal Handler marchait bien...


---------------
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