diff options
| author | Florian Fischer <florian.fl.fischer@fau.de> | 2019-10-13 17:19:01 +0200 |
|---|---|---|
| committer | Florian Fischer <florian.fl.fischer@fau.de> | 2019-10-13 17:19:01 +0200 |
| commit | 1d50a146ea0c7a517564bf3ec2a79cd2bb3c8c79 (patch) | |
| tree | 6be533ee2c82eba3de7619278e1e981473848e46 /src/sig_handlers.c | |
| parent | 19e1ff660db8a6653d67884d10bc830babc1560d (diff) | |
| parent | cc7edda1871c89c7476c67eacf3e6aee56262e2d (diff) | |
| download | allocbench-1d50a146ea0c7a517564bf3ec2a79cd2bb3c8c79.tar.gz allocbench-1d50a146ea0c7a517564bf3ec2a79cd2bb3c8c79.zip | |
Merge branch 'catch_abort'
Diffstat (limited to 'src/sig_handlers.c')
| -rw-r--r-- | src/sig_handlers.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/sig_handlers.c b/src/sig_handlers.c new file mode 100644 index 0000000..3274482 --- /dev/null +++ b/src/sig_handlers.c @@ -0,0 +1,37 @@ +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +static void abnormal_termination_handler(int signo) { + psignal(signo, ""); + exit(signo); +} + +static void __attribute__((constructor)) register_handlers(void) +{ + struct sigaction sa, old_sa; + sa.sa_handler = abnormal_termination_handler; + sigemptyset(&sa.sa_mask); + + sigaction(SIGABRT, NULL, &old_sa); + if (old_sa.sa_handler == SIG_DFL) { + if (sigaction(SIGABRT, &sa, NULL) == -1) { + perror("sigaction"); + exit(1); + } + } else { + fprintf(stderr, "SIGABRT handler already set"); + } + + sigaction(SIGSEGV, NULL, &old_sa); + if (old_sa.sa_handler == SIG_DFL) { + if (sigaction(SIGSEGV, &sa, NULL) == -1) { + perror("sigaction"); + exit(1); + } + } else { + fprintf(stderr, "SIGSEGV handler already set"); + } +} + |
