#1 Le 28/04/2009, à 19:41
- helios91940
Programmation Système en C - Déroutement des signaux
Bonjour à tous!
Voici le code source du programme qui me pose problème
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
void gestionSIGSEGV(int numSig) {
fprintf(stderr, "Erreur ici!\n");
}
int main() {
signal(SIGSEGV, gestionSIGSEGV);
double *j;
j = (double *)2;
scanf("%lf", j);
exit(0);
}
On tente d'écrire à l'adresse 2 qui est une zone mémoire non allouée.
Le système envoie donc un signal SIGSEGV au processus en cours.
Or ce signal est dérouté et géré par la fonction gestionSIGSEGV qui affiche un simple message.
Lors de l'éxécution j'obtiens une boucle infinie
Erreur ici!
Erreur ici!
Erreur ici!
...
J'ai d'abord ajouté la fonction siginterrupt pour éviter qu'un appel système soit relancé en cas d'échec du à la réception d'un signal
int main() {
/* Déroutement du signal SIGSEGV */
signal(SIGSEGV, gestionSIGSEGV);
siginterrupt(SIGSEGV, 1);
double *j;
j = (double *)2;
/*
* On tente d'écrire dans la case mémoire ayant l'adresse 2
* Emission d'un signal SIGSEGV par le système
*/
scanf("%lf", j);
printf("Fin scanf\n");
exit(0);
}
Même problème à l'éxécution....
J'ai ensuite ajouté le code suivant dans la fonction de gestion du signal
void gestionSIGSEGV(int numSig) {
int i;
fprintf(stderr, "Erreur ici!\n");
scanf("%i", &i);
printf("Le nb lu: %i\n", i);
}
Et lors de l'exécution j'obtiens quelque chose de très étrange
1
Erreur ici!
5
Le nb lu: 5
Erreur ici!
6
Le nb lu: 6
Erreur ici!
7
Le nb lu: 7
Erreur ici!
La fonction gestionSIGSEGV est donc appelée à l'infini.
Quelqu'un pourrait-il m'expliquer ce qui cloche...
Merci d'avance!
There is no system but GNU, and Linux is one of its kernels.
Adhérez à l'APRIL!
http://www.april.org/adherer
Hors ligne
#2 Le 28/04/2009, à 20:31
- nicolas.sitbon
Re : Programmation Système en C - Déroutement des signaux
d'après la norme :
If and when the function returns, if the value of sig was SIGFPE, SIGILL, or SIGSEGV or any other implementation-defined value corresponding to a computational exception, the behavior is undefined.
et
when a signal interrupts an unsafe function and the signal-catching function calls an unsafe function, the behavior is undefined.
Je te laisse réfléchir.
Hors ligne
#3 Le 28/04/2009, à 20:36
- helios91940
Re : Programmation Système en C - Déroutement des signaux
Peux tu citer tes sources? Merci d'avance
EDIT: sources trouvées grace à un moteur de recherche dont le nom commence par G
Dernière modification par helios91940 (Le 28/04/2009, à 21:21)
There is no system but GNU, and Linux is one of its kernels.
Adhérez à l'APRIL!
http://www.april.org/adherer
Hors ligne
#4 Le 28/04/2009, à 21:29
- nicolas.sitbon
Re : Programmation Système en C - Déroutement des signaux
Peux tu citer tes sources?
Première ligne de mon post : "d'après la norme"
...
Hors ligne
#5 Le 01/05/2009, à 12:13
- rniamo
Re : Programmation Système en C - Déroutement des signaux
man 2 signal aussi :
Comme spécifié par POSIX, le comportement d’un processus est indéfini
après la réception d’un signal SIGFPE, SIGILL, ou SIGSEGV qui n’a pas
été engendré par une fonction kill(2) ou raise(3). La division entière
par zéro a un résultat indéfini, sur certaines architectures elle
déclenche un signal SIGFPE. De même, diviser l’entier le plus négatif
par -1 peut déclencher SIGFPE.
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#6 Le 01/05/2009, à 12:30
- nicolas.sitbon
Re : Programmation Système en C - Déroutement des signaux
man 2 signal aussi :
Comme spécifié par POSIX, le comportement d’un processus est indéfini
après la réception d’un signal SIGFPE, SIGILL, ou SIGSEGV qui n’a pas
été engendré par une fonction kill(2) ou raise(3). La division entière
par zéro a un résultat indéfini, sur certaines architectures elle
déclenche un signal SIGFPE. De même, diviser l’entier le plus négatif
par -1 peut déclencher SIGFPE.
Les manpages ne sont plus à conseiller.
Hors ligne
#7 Le 01/05/2009, à 12:51
- rniamo
Re : Programmation Système en C - Déroutement des signaux
pourquoi ?
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#8 Le 01/05/2009, à 13:31
- nicolas.sitbon
Re : Programmation Système en C - Déroutement des signaux
pourquoi ?
Premièrement, il y a trop d'erreurs dans celle ci, sans parler des erreurs traductions, deuxièmement, la norme est accessible gratuitement en ligne alors autant aller directement à la source et éviter les erreurs des autres.
Hors ligne
#9 Le 01/05/2009, à 13:36
- rniamo
Re : Programmation Système en C - Déroutement des signaux
ah, ok ... mais quand on a pas toujours net c'est pratique. merci de ta réponse
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#10 Le 01/05/2009, à 14:53
- nicolas.sitbon
Re : Programmation Système en C - Déroutement des signaux
ah, ok ... mais quand on a pas toujours net c'est pratique. merci de ta réponse
J'oubliais cet argument, merci de me le rappeler, n'importe qui peut télécharger l'intégralité de la norme au format HTML, que demander de plus?
Dernière modification par nicolas.sitbon (Le 01/05/2009, à 15:10)
Hors ligne
#11 Le 01/05/2009, à 15:05
- rniamo
Re : Programmation Système en C - Déroutement des signaux
qu'elle s'installe toute seule avec les paquets de developpement (je blague)
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#12 Le 01/05/2009, à 15:09
- Nidos
Re : Programmation Système en C - Déroutement des signaux
Et l'orthographe ça compte en programmation?:rolleyes:
Hors ligne