20 static void signal_handler(
int signal, siginfo_t *sip,
void *ucp)
33 convert_name_to_signal(
36 if (signal ==
"SIGABRT" || signal ==
"SIGKILL") {
41 if (signal ==
"SIGILL")
return SIGILL;
44 if (signal ==
"SIGSEGV")
return SIGSEGV;
47 if (signal ==
"SIGALRM")
return SIGALRM;
50 if (signal ==
"SIGFPE")
return SIGFPE;
53 if (signal ==
"SIGHUP")
return SIGHUP;
56 if (signal ==
"SIGINT")
return SIGINT;
59 if (signal ==
"SIGPIPE")
return SIGPIPE;
62 if (signal ==
"SIGQUIT")
return SIGQUIT;
65 if (signal ==
"SIGTERM")
return SIGTERM;
68 if (signal ==
"SIGUSR1")
return SIGUSR1;
71 if (signal ==
"SIGUSR2")
return SIGUSR2;
83 return signal_handler;
91 typedef std::vector<const HandlerMap::value_type *> HandlerList;
93 time_t now = ::time(NULL);
95 std::cerr <<
"Sierra received signal " << signal <<
" at " << ::ctime(&now) << std::endl;
99 std::pair<HandlerMap::const_iterator, HandlerMap::const_iterator> range = m_handlerMap.equal_range(signal);
101 for (HandlerMap::const_iterator pos = range.first; pos != range.second; ++pos)
102 handlers.push_back(&*pos);
104 for (HandlerList::const_iterator it = handlers.begin(); it != handlers.end(); ++it) {
112 SignalHandler::check_signal_name(
115 int isignal = convert_name_to_signal(signal);
116 return (isignal >= 0);
125 int isignal = convert_name_to_signal(signal);
129 else if (isignal == -1)
130 throw std::runtime_error(
"signal cannot be handled");
131 else if (isignal == -2)
132 throw std::runtime_error(
"signal name invalid");
134 throw std::logic_error(
"invalid value from convert_node_to_signal()");
144 if (m_handlerMap.find(signal) == m_handlerMap.end()) {
146 struct sigaction action;
147 struct sigaction *old_action =
new struct sigaction;
149 action.sa_sigaction = signal_handler;
150 sigemptyset(&action.sa_mask);
151 action.sa_flags = SA_SIGINFO;
152 ::sigaction(signal, &action, old_action);
153 m_oldActionMap.insert(OldActionMap::value_type(signal, old_action));
155 m_handlerMap.insert(HandlerMap::value_type(signal, &callback));
164 typedef std::pair<HandlerMap::iterator, HandlerMap::iterator> HandlerRange;
166 HandlerRange handler_range = m_handlerMap.equal_range(signal);
167 for (HandlerMap::iterator it = handler_range.first; it != handler_range.second; )
168 if ((*it).second == &callback) {
169 HandlerMap::iterator erase_it = it++;
170 m_handlerMap.erase(erase_it);
175 if (m_handlerMap.find(signal) == m_handlerMap.end()) {
176 OldActionMap::iterator it = m_oldActionMap.find(signal);
177 if (it != m_oldActionMap.end()) {
178 ::sigaction(signal, (*it).second, NULL);
180 m_oldActionMap.erase(it);
191 int isignal = convert_name_to_signal(signal);
195 else if (isignal == -1)
196 throw std::runtime_error(
"signal cannot be handled");
197 else if (isignal == -2)
198 throw std::runtime_error(
"signal name invalid");
200 throw std::logic_error(
"invalid value from convert_node_to_signal()");
207 m_handlerMap.clear();
209 for (OldActionMap::iterator it = m_oldActionMap.begin(); it != m_oldActionMap.end(); ++it) {
210 ::sigaction((*it).first, (*it).second, NULL);
213 m_oldActionMap.clear();
void remove_all_handlers()
Member function remove_all_handlers ...
void remove_handler(int signal, CallbackBase &callback)
Member function remove_handler ...
static SignalHandler & instance()
Member function instance ...
void add_handler(int signal, CallbackBase &callback)
Member function add_handler ...
void handle_signal(int signal)
Member function handle_signal ...