#include <log/log.h>
#include <signal.h>
#include <execinfo.h>
#define BACKTRACE_SIZE 16
void sig_handler(int signo);
void dump_error(void)
{
int j, nptrs;
void *buffer[BACKTRACE_SIZE];
char **strings;
nptrs = backtrace(buffer, BACKTRACE_SIZE);
strings = backtrace_symbols(buffer, nptrs);
if (strings == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
for (j = 0; j < nptrs; j++)
ALOGD(" [%02d] %s\n", j, strings[j]);
free(strings);
}
void sig_handler(int signo)
{
switch(signo) {
case SIGINT: //signal SIGINT
ALOGD("SIGINT received...\n");
break;
case SIGQUIT: //signal SIGINT
ALOGD("SIGINT received...\n");
break;
case SIGKILL: //signal SIGKILL
ALOGD("SIGKILL received...\n");
break;
case SIGTERM: //signal SIGTERM
ALOGD("SIGTERM received...\n");
break;
case SIGUSR1: //signal SIGUSR1
signal(SIGUSR1,SIG_IGN);
ALOGD("SIGUSR1 received...\n");
break;
case SIGUSR2: //signal SIGUSR2
ALOGD("SIGUSR2 received...\n");
signal(SIGUSR2,SIG_DFL);
break;
case SIGALRM: //signal SIGALRM
ALOGD("SIGALRM received...\n");
break;
case SIGABRT: //signal
ALOGD("SIGABRT received...\n");
break;
case SIGSEGV:
ALOGD("SIGSEGV received...\n");
dump_error();
signal(signo, SIG_DFL);
//raise(signo);
exit(0);
case SIGPIPE:
ALOGD("SIGPIPE received...\n");
break;
case SIGILL:
ALOGD("SIGILL received...\n");
break;
case SIGFPE:
ALOGD("SIGFPE received...\n");
break;
case SIGHUP:
ALOGD("SIGHUP received...\n");
break;
default:
ALOGD("maybe others signal");
break;
}
}
int main(void)
{
signal( SIGINT , sig_handler);
signal( SIGQUIT , sig_handler);
signal( SIGKILL , sig_handler);
signal( SIGTERM , sig_handler);
signal( SIGALRM , sig_handler);
signal( SIGUSR1 , sig_handler);
signal( SIGUSR2 , sig_handler);
signal( SIGABRT , sig_handler);
signal( SIGSEGV , sig_handler);
signal( SIGPIPE , sig_handler);
signal( SIGILL , sig_handler);
signal( SIGFPE , sig_handler);
signal( SIGHUP , sig_handler);
printf("Process_pid = [%d]\n", getpid());
sleep(2);
char *ptr = "hello";
*ptr = 'H';
return 0
}
运行
1980-01-19 02:54:52.978 JA310-1881 user.debug shift: [536 | 536]: SIGSEGV received...
1980-01-19 02:54:52.978 JA310-1881 user.debug shift: [536 | 536]: [00] ./usr/sbin/sysprop() [0x4014f4]