Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

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

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

helios91940 a écrit :

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

rniamo a écrit :

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

rniamo a écrit :

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

rniamo a écrit :

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