Signal Handler (segmentation fault) - C++ - Programmation
Marsh Posté le 15-10-2003 à 11:48:06
man signal (pour faire simple)
man sigaction pour les 3l33t modernes
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++????
Marsh Posté le 15-10-2003 à 12:04:32
1- oui
2- oui
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)
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
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++.
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.
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 vachement bien.
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
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....
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. |
autant pour moa
Marsh Posté le 15-10-2003 à 23:06:48
scool36 a écrit : ... |
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.
Marsh Posté le 16-10-2003 à 01:08:23
ReplyMarsh Posté le 16-10-2003 à 15:36:08
Le SGIINT c'etait juste pour tester si le Signal Handler marchait bien...
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...