int main() { struct sigaction sigact; struct itimerval itval; sigact.sa_handler = HandleSegv; sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; if (sigaction(SIGSEGV, &sigact, 0) == -1) { fprintf(stderr, "Unable handle SEGV\n"); return 1; } sigact.sa_handler = HandleAlarm; if (sigaction(SIGVTALRM, &sigact, 0) == -1) { fprintf(stderr, "Unable handle VTALRM\n"); return 1; } itval.it_value.tv_sec = 0; itval.it_value.tv_usec = 100000; itval.it_interval.tv_sec = 0; itval.it_interval.tv_usec = 0; if (setitimer(ITIMER_VIRTUAL, &itval, 0) == -1) { fprintf(stderr, "Unable to set up alarm\n"); return 1; } MakeSegv(); return 0; }
void Handle(int sig, siginfo_t* info, void* vctxt) { struct sigaction sigact; if (sig == SIGSEGV) printf("Got signal SEGV\n"); else if(sig == SIGBUS) printf("Got signal SIGBUS\n"); else printf("Got signal %d\n", sig); /* * Print out some information about the SEGV disposition. The handler should * be reset to SIG_DFL. I'm not sure if the standard defines what happens to * the other fields. */ if (sigaction(sig, 0, &sigact) == -1) { printf("Unable to read signal information\n"); exit(1); } if (sigact.sa_handler == SIG_DFL) printf("sa_handler = SIG_DFL\n"); else printf("sa_handler = 0x%p\n", sigact.sa_handler); if (sigact.sa_flags & (SA_RESETHAND | SA_SIGINFO)) printf("sa_flags = [SA_RESETHAND, SA_SIGINFO]\n"); else if (sigact.sa_flags & SA_RESETHAND) printf("sa_flags = [SA_RESETHAND]\n"); else if (sigact.sa_flags & SA_SIGINFO) printf("sa_flags = [SA_SIGINFO]\n"); else printf("sa_flags = []\n"); if (sigismember(&sigact.sa_mask, SIGUSR1)) printf("sa_mask = [SIGUSR1]\n"); else printf("sa_mask = []\n"); fflush(stdout); if (First) { First = 0; MakeSegv(); /* does not return */ } printf("Should not receive second SEGV\n"); exit(1); }
int main() { struct sigaction sigact; sigact.sa_sigaction = Handle; sigact.sa_flags = (SA_RESETHAND | SA_SIGINFO); sigemptyset(&sigact.sa_mask); sigaddset(&sigact.sa_mask, SIGUSR1); if (sigaction(SIGSEGV, &sigact, 0) == -1) { printf("Unable to handle signal\n"); return 1; } if (sigaction(SIGBUS, &sigact, 0) == -1) { printf("Unable to handle signal\n"); return 1; } MakeSegv(); printf("Should not return from first SEGV\n"); return 1; }