cmem/sigtest.c

67 lines
1.3 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <setjmp.h>
const int SIGNAL_TYPE = SIGSEGV;
// Global flag and jump buffer for recovery
static jmp_buf env_buffer;
static volatile int handled = 0;
void handler(int signal_num) {
handled += 1;
longjmp(env_buffer, 1);
}
int trigger() {
if(setjmp(env_buffer)) {
return 1;
}
//volatile char _ = *((char*)0);
raise(SIGNAL_TYPE);
return 0;
}
int printSigMasks() {
sigset_t set;
// Get the current signal mask
if (sigprocmask(SIG_BLOCK, NULL, &set) == -1) {
perror("sigprocmask");
return 1;
}
// Print blocked signal masks
int blocked = 0;
for (int i = 1; i < NSIG; ++i) {
if (sigismember(&set, i)) {
blocked += 1;
printf("Signal %d is blocked\n", i);
}
}
if(!blocked) {
printf("No blocked signals\n");
}
return 0;
}
int main(int argc, char *argv[]) {
printf("NSIG = %i\n", NSIG);
void* sig_res = signal(SIGNAL_TYPE, handler);
if(sig_res == SIG_ERR) {
printf("Error setting signal handler\n");
exit(EXIT_FAILURE);
}
int result = 0;
printSigMasks();
result = trigger();
printf("Raised = %i\tHandled = %i\n", result, handled);
printSigMasks();
result = trigger();
printf("Raised = %i\tHandled = %i\n", result, handled);
printSigMasks();
return EXIT_SUCCESS;
}