#ifndef ALARMA_H #define ALARMA_H #include #include // signal #include class signal_handler { public: typedef void (*handler_t)(int); signal_handler(int s, handler_t handler): signal_number(s) { old_handler = signal(signal_number, handler); } ~signal_handler() { signal(signal_number, old_handler); } private: int signal_number; handler_t old_handler; }; // struct sigaction // { // void (*sa_handler)(int); // void (*sa_sigaction)(int, siginfo_t *, void *); // sigset_t sa_mask; // int sa_flags; // void (*sa_restorer)(void); // }; class signal_set { public: typedef void (*handler_t)(int); signal_set(int s, handler_t handler, int flags = 0) : signal_number(s), 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_set() { if (installed) sigaction(signal_number, &old_action, nullptr); } signal_set(const signal_set &) = delete; signal_set &operator=(const signal_set &) = delete; private: int signal_number; struct sigaction old_action; bool installed; }; #endif // ALARMA_H