66 using HandlerFunc = std::function<void(
int)>;
68 static void registerHandler(
int signum, HandlerFunc handler) {
69 auto& vec = getHandlers()[signum];
70 vec.push_back(handler);
71 std::signal(signum, SignalHandler::dispatch);
76 static std::map<int, std::vector<HandlerFunc>>& getHandlers() {
77 static std::map<int, std::vector<HandlerFunc>> handlers;
84 static void dispatch(
int signum) {
85 char sig = (char)signum;
86 ssize_t n = write(pipeWriteFd(), &sig, 1);
90 static int& pipeWriteFd() {
94 static int& pipeReadFd() {
101 static void ensureReaperThread() {
102 static std::once_flag started;
103 std::call_once(started, [] {
106 pipeReadFd() = fds[0];
107 pipeWriteFd() = fds[1];
110 while (read(pipeReadFd(), &sig, 1) == 1) {
111 int signum = (int)(
unsigned char)sig;
112 auto& handlers = getHandlers();
113 auto it = handlers.find(signum);
114 if (it != handlers.end()) {
115 for (
auto& func : it->second) {