#ifndef SIGNAL_H #define SIGNAL_H #include // errno #include // sigaction, sigemptyset #include // std::system_error namespace as { class signal { public: typedef void (*handler_t)(int); signal(int number, handler_t handler, int flags = 0) : signal_number(number), installed(false) { struct sigaction new_action; new_action.sa_handler = handler; new_action.sa_flags = flags; sigemptyset(&new_action.sa_mask); if (sigaction(signal_number, &new_action, &old_action) == -1) throw std::system_error(errno, std::generic_category(), "sigaction install failed"); installed = true; } ~signal() { if (installed) sigaction(signal_number, &old_action, nullptr); } signal(const signal &) = delete; signal &operator=(const signal &) = delete; private: int signal_number; struct sigaction old_action; bool installed; }; // signal } // namespace as #endif // SIGNAL_H