Reset the signal handlers when SIGINT or SIGTERM is received

To avoid doing a double exit when receiving bot SIGINT and SIGTERM
This commit is contained in:
Florent Le Coz
2015-04-20 23:58:05 +02:00
parent 0d706741c6
commit 6a28bde1dd
+12
View File
@@ -40,6 +40,18 @@ int config_help(const std::string& missing_option)
static void sigint_handler(int sig, siginfo_t*, void*) static void sigint_handler(int sig, siginfo_t*, void*)
{ {
// We reset the SIGTERM or SIGINT (the one that didn't trigger this
// handler) signal handler to its default value. This avoid calling this
// handler twice, if the process receive both signals in a quick
// succession.
int sig_to_reset = (sig == SIGINT? SIGTERM: SIGINT);
sigset_t mask;
sigemptyset(&mask);
struct sigaction sigreset = {};
sigreset.sa_handler = SIG_DFL;
sigreset.sa_mask = mask;
sigaction(sig_to_reset, &sigreset, nullptr);
// In 2 seconds, repeat the same signal, to force the exit // In 2 seconds, repeat the same signal, to force the exit
TimedEventsManager::instance().add_event(TimedEvent(std::chrono::steady_clock::now() + 2s, TimedEventsManager::instance().add_event(TimedEvent(std::chrono::steady_clock::now() + 2s,
[sig]() { raise(sig); })); [sig]() { raise(sig); }));