github.com/searKing/golang/go@v1.2.117/os/signal/cgo/signal_handler_linux.hpp (about) 1 // Copyright (c) 2019 The searKing authors. All Rights Reserved. 2 // 3 // Use of this source code is governed by a MIT-style license 4 // that can be found in the LICENSE file in the root of the source 5 // tree. An additional intellectual property rights grant can be found 6 // in the file PATENTS. All contributing project authors may 7 // be found in the AUTHORS file in the root of the source tree. 8 9 //go:build cgo && linux 10 11 #ifndef GO_OS_SIGNAL_CGO_SIGNAL_HANDLER_LINUX_HPP_ 12 #define GO_OS_SIGNAL_CGO_SIGNAL_HANDLER_LINUX_HPP_ 13 14 #include <unistd.h> 15 // You can find out the version with _POSIX_VERSION. 16 // POSIX compliant 17 18 #include <csignal> 19 #include <functional> 20 #include <map> 21 #include <memory> 22 #include <utility> 23 24 #include "base_signal_handler.hpp" 25 26 namespace searking { 27 28 // Callbacks Predefinations 29 30 typedef void (*SignalHandlerSigActionHandler)(int signum, siginfo_t *info, 31 void *context); 32 typedef void (*SignalHandlerSignalHandler)(int signum); 33 typedef void (*SignalHandlerOnSignal)(void *ctx, int fd, int signum, 34 siginfo_t *info, void *context); 35 36 class SignalHandler : public BaseSignalHandler<SignalHandler> { 37 protected: 38 SignalHandler() : on_signal_ctx_(nullptr), on_signal_(nullptr) {} 39 40 void SetGoRegisteredSignalHandlersIfEmpty( 41 int signum, SignalHandlerSigActionHandler action, 42 SignalHandlerSignalHandler handler); 43 void DoSignalChan(int signum, siginfo_t *info, void *context); 44 void InvokeGoSignalHandler(int signum, siginfo_t *info, void *context); 45 46 public: 47 // Thread safe GetInstance. 48 static SignalHandler &GetInstance(); 49 50 void operator()(int signum, siginfo_t *info, void *context); 51 // never invoke a go function, see 52 // https://github.com/golang/go/issues/35814 53 void RegisterOnSignal(std::function<void(void *ctx, int fd, int signum, 54 siginfo_t *info, void *context)> 55 callback, 56 void *ctx); 57 58 static int SetSig(int signum); 59 static int SetSig(int signum, SignalHandlerSigActionHandler action, 60 SignalHandlerSignalHandler handler); 61 62 private: 63 void *on_signal_ctx_; 64 std::function<void(void *ctx, int fd, int signum, siginfo_t *info, 65 void *context)> 66 on_signal_; 67 std::map<int, std::pair<SignalHandlerSigActionHandler, 68 SignalHandlerSignalHandler> > 69 go_registered_handlers_; 70 }; 71 } // namespace searking 72 #endif