- struct sigaction new_action, old_action;
-
- new_action.sa_handler = func;
- sigemptyset(&new_action.sa_mask);
- new_action.sa_flags = 0;
-
-#define SET_IF_NOT_IGNORED(sig) \
- do { \
- sigaction(sig, NULL, &old_action); \
- if (old_action.sa_handler != SIG_IGN) \
- sigaction(sig, &new_action, NULL); \
- } while (0)
-
- SET_IF_NOT_IGNORED(SIGINT);
- SET_IF_NOT_IGNORED(SIGHUP);
- SET_IF_NOT_IGNORED(SIGTERM);
-
+ interrupts.handler = func;
+
+ if (!interrupts.set) {
+ struct sigaction new_action, old_action;
+ new_action.sa_handler = InterruptHandler;
+ sigemptyset(&new_action.sa_mask);
+ new_action.sa_flags = 0;
+#define SET_IF_NOT_IGNORED(sig, old_handler) \
+ do { \
+ sigaction(sig, NULL, &old_action); \
+ if (old_action.sa_handler != SIG_IGN) { \
+ old_handler = old_action.sa_handler; \
+ sigaction(sig, &new_action, NULL); \
+ } \
+ } while (0)
+
+ SET_IF_NOT_IGNORED(SIGINT, interrupts.sig_int);
+ SET_IF_NOT_IGNORED(SIGHUP, interrupts.sig_hup);
+ SET_IF_NOT_IGNORED(SIGTERM, interrupts.sig_term);
+
+ interrupts.set = true;