2011-05-03 5 views
0

Je reçois coredump lors de l'exécution ci-dessous le programme:Comment gérer le signal SIGABRT dans unix

$ cat test2.c 

#include <stdio.h> 
#include <stdlib.h> 


void main() 
{ 

abort(); 

} 

$ 

$ cc -o test2 test2.c 
"test2.c", line 5: warning #2951-D: return type of function "main" must be 
      "int" 
    void main() 
    ^

$ ./test2 
Abort(coredump) 
$ 

J'ai reçu un signal SIGABRT. Veuillez me suggérer les moyens de gérer ce signal SIGABRT.

+0

http://en.wikipedia.org/wiki/SIGABRT –

Répondre

3

supprimer abort() de votre principale ... si vous voulez laisser principal: return; si vous voulez quitter le programme en tout lieu: exit()

si vous voulez vraiment gérer le signal, installer un signal gestionnaire voir: http://www.manpagez.com/man/2/sigaction/

HTH

Mario

3

Y Normalement, vous ne devriez pas le gérer, le but de l'appel à abort() est de produire un core dump et de terminer votre programme, comme le fait votre programme.

2
// here's same code w/signal handler 
$ cat test.c 
#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 

void abort_handler(int); 

void main() 
{ 
    if (signal(SIGABRT, abort_handler) == SIG_ERR) { 
     fprintf(stderr, "Couldn't set signal handler\n"); 
     exit(1); 
    } 
    abort(); 
    exit(0); 
} 

void abort_handler(int i) 
{ 
    fprintf(stderr, "Caught SIGABRT, exiting application\n"); 
    exit(1); 
} 
$ cc -o test test.c 
$ ./test 
Caught SIGABRT, exiting application 
$ 
+0

savoir que vous pouvez gérer SIGABRT mais vous ne pouvez pas arrêter le processus de terminaison (et le dumping) –

+1

Je ne sais pas dans quelle mesure cette déclaration dépend du système, sur le système que j'ai compilé et exécuté le code ci-dessus, aucun noyau n'a été jeté.
$ uname -a Linux nas 2.6.32-30-générique # 59 Ubuntu SMP Mar 1 21:30:46 UTC Mar 2011 x86_64 GNU/Linux Voir signal de l'homme, ainsi que l'homme 7 signal – bsd

Questions connexes