2010-08-11 3 views
1

Le code suivant déclenche une erreur de segmentation à la sortie. Il semble se produire que si les données sont alloués sur la pile entre le « sigaction » appel et la boucle:C++/gcc: erreur de segmentation à la sortie de la main après avoir intercepté un signal

#include <signal.h> 
#include <unistd.h> 

bool end = false; 
void handler(int) { 
end = true; 
} 

int main() { 
struct sigaction sigs; 
sigs.sa_handler = handler; 
sigaction(SIGINT, &sigs, NULL); 

int i; 

while (!end) 
    sleep(1); 
return 0; 
} 

Exécuter et arrêter avec ctrl-C

-> ligne « int i » sur : erreur de segmentation

-> sans ligne 'int i': sortie ok

(compilé avec g ++ v4.1.1, OS noyau linux 2.6.19)

sons comme un problème de libération de pile ... quelqu'un a une explication?

Merci,

Répondre

3

Vous devez initialiser tous les membres de votre struct sigaction, à risque de ne pas l'avoir contient des ordures, il y a des drapeaux/etc. là que modifier le comportement de sigaction() Do

struct sigaction args = {}; 

ou

memset(&args,0,sizeof args); 
+0

Pourquoi avez-vous un zéro dans le {} s? –

+0

Vieille habitude. Supprimé maintenant – nos

+0

cela fonctionne, merci nos – Francois

Questions connexes