aboutsummaryrefslogtreecommitdiff
path: root/src/sig_handlers.c
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fl.fischer@fau.de>2019-10-13 17:19:01 +0200
committerFlorian Fischer <florian.fl.fischer@fau.de>2019-10-13 17:19:01 +0200
commit1d50a146ea0c7a517564bf3ec2a79cd2bb3c8c79 (patch)
tree6be533ee2c82eba3de7619278e1e981473848e46 /src/sig_handlers.c
parent19e1ff660db8a6653d67884d10bc830babc1560d (diff)
parentcc7edda1871c89c7476c67eacf3e6aee56262e2d (diff)
downloadallocbench-1d50a146ea0c7a517564bf3ec2a79cd2bb3c8c79.tar.gz
allocbench-1d50a146ea0c7a517564bf3ec2a79cd2bb3c8c79.zip
Merge branch 'catch_abort'
Diffstat (limited to 'src/sig_handlers.c')
-rw-r--r--src/sig_handlers.c37
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");
+ }
+}
+