-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsignal.hh
62 lines (49 loc) · 1.39 KB
/
signal.hh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#pragma once
// capture user abort / & terminal hang
// through a global booleen flags.
#include <csignal>
#include <iostream>
extern "C"
void SIGINT_handler(int sig);
extern "C"
void SIGHUP_handler(int sig);
class SignalHandler {
public:
static
volatile sig_atomic_t called; // signal flags
sighandler_t prev_SIGINT;
sighandler_t prev_SIGHUP;
SignalHandler() {
called = false;
prev_SIGINT = std::signal(SIGINT, SIGINT_handler); // Install CTR-C signal handler
prev_SIGHUP = std::signal(SIGHUP, SIGHUP_handler); // Install Hangup signal handler
}
~SignalHandler() { // reinstall default signal(s)
std::signal(SIGINT, prev_SIGINT);
std::signal(SIGHUP, prev_SIGHUP);
}
static
void check() {
if( called) {
std::cerr << "*** SIGNAL throw\n";
throw "*** SIGNAL called\n";
}
}
};
volatile sig_atomic_t SignalHandler::called = false;
extern "C"
void SIGINT_handler(int sig) {
SignalHandler::called = true;
/*
const char msg[] = "*** SIGINT: Caught\n";
write(STDERR_FILENO, msg, sizeof(msg)); // ok, write is signal-safe
*/
}
extern "C"
void SIGHUP_handler(int sig) {
SignalHandler::called = true;
/*
const char msg[] = "*** SIGHUP: Caught\n";
write(STDERR_FILENO, msg, sizeof(msg)); // ok, write is signal-safe
*/
}