NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
signal.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_SYSTEM_SIGNAL_HPP__
2#define NEFORCE_CORE_SYSTEM_SIGNAL_HPP__
3
10
17#ifdef NEFORCE_PLATFORM_WINDOWS
19# include <consoleapi.h>
20# ifdef NEFORCE_COMPILER_MINGW
21# include <windef.h>
22# include <wingdi.h>
23# include <wincon.h>
24# endif
25#endif
26#ifdef NEFORCE_PLATFORM_LINUX
27# include <csignal>
28#endif
29NEFORCE_BEGIN_NAMESPACE__
30
36
49class NEFORCE_API system_signal_manager {
50public:
57 enum class event {
58#ifdef NEFORCE_PLATFORM_WINDOWS
59 INTERRUPT = CTRL_C_EVENT,
60 CTRL_BREAK = CTRL_BREAK_EVENT,
61 CLOSE = CTRL_CLOSE_EVENT,
62 LOGOFF = CTRL_LOGOFF_EVENT,
63 SHUTDOWN = CTRL_SHUTDOWN_EVENT,
64
65 TERMINATE = 1000,
66 ABORT = 1001,
67 ILLEGAL_INSTR = 1002,
68 FLOATING_POINT = 1003,
69 SEGMENT_FAULT = 1004,
70 BUS_ERROR = 1005,
71 PIPE_BROKEN = 1006,
72 ALARM = 1007,
73 HANGUP = 1008,
74 USER1 = 1009,
75 USER2 = 1010,
76
77 TIMEOUT = 2000,
78 CUSTOM_1 = 2001,
79 CUSTOM_2 = 2002,
80 FORCE_EXIT = 9999
81#else
82 INTERRUPT = SIGINT,
83 TERMINATE = SIGTERM,
84 ABORT = SIGABRT,
85 ILLEGAL_INSTR = SIGILL,
86 FLOATING_POINT = SIGFPE,
87 SEGMENT_FAULT = SIGSEGV,
88 BUS_ERROR = SIGBUS,
89 PIPE_BROKEN = SIGPIPE,
90 ALARM = SIGALRM,
91 HANGUP = SIGHUP,
92 USER1 = SIGUSR1,
93 USER2 = SIGUSR2,
94
95 CTRL_BREAK = 1000,
96 CLOSE = 1001,
97 LOGOFF = 1002,
98 SHUTDOWN = 1003,
99
100 TIMEOUT = 2000,
101 CUSTOM_1 = 2001,
102 CUSTOM_2 = 2002,
103 FORCE_EXIT = 9999
104#endif
105 };
106
113 using signal_handler = function<bool(event, void*)>;
114
115private:
120 struct signal_result {
122 void* context;
123 };
124
129 struct pending_signal {
130 event signal_event;
131 void* context;
133
134 pending_signal(const event event, void* context, const steady_clock::time_point timestamp) :
135 signal_event{event},
136 context{context},
138 };
139
140 atomic<bool> running_{false};
141 atomic<bool> force_exit_{false};
142 atomic<int> force_exit_timeout_{5000};
143
144 atomic<int> guard_count_{0}; // 作用域管理器的引用计数
145
146 mutex mutex_;
147 condition_variable cv_;
148
149 unordered_map<event, signal_handler> handlers_;
150 vector<pending_signal> pending_signals_;
151
152#ifdef NEFORCE_PLATFORM_WINDOWS
153 system_event notify_event_;
154#else
155 struct ::sigaction old_actions_[64]{};
156#endif
157
158 thread signal_thread_;
159 thread timeout_thread_;
160
161 friend class signal_guard;
162
163 system_signal_manager();
164
165 void add_guard_ref() {
166 if (guard_count_++ == 0) {
167 start_monitoring();
168 }
169 }
170
171 void remove_guard_ref() noexcept {
172 if (--guard_count_ == 0) {
173 stop_monitoring();
174 }
175 }
176
177 void initialize();
178 void cleanup();
179
180 void signal_thread_func();
181 void timeout_monitor_thread();
182
183 void process_signal(event event, void* context);
184 void trigger_force_exit();
185 signal_result wait_for_signal_internal(int timeout_ms = -1);
186 void send_signal_nolock(event event, void* context);
187
188public:
189 system_signal_manager(const system_signal_manager&) = delete;
190 system_signal_manager& operator=(const system_signal_manager&) = delete;
191 system_signal_manager(const system_signal_manager&&) = delete;
192 system_signal_manager& operator=(const system_signal_manager&&) = delete;
193
194 ~system_signal_manager();
195
200 static system_signal_manager& instance() {
201 static system_signal_manager instance;
202 return instance;
203 }
204
212
218 void register_handlers(const vector<event>& events, const signal_handler& handler);
219
225
233 event wait_for_signal(int timeout_ms = -1);
234
240 void send_signal(event event, void* context = nullptr);
241
248 void set_force_exit_timeout(int timeout_ms);
249
254
258 void stop_monitoring() noexcept;
259
265
270 NEFORCE_NODISCARD bool is_running() const;
271
277 bool block_signals(const vector<event>& signals_to_block) const;
278
284 bool unblock_signals(const vector<event>& signals_to_unblock) const;
285
291 NEFORCE_NODISCARD static bool is_platform_signal(event event) {
292#ifdef NEFORCE_PLATFORM_WINDOWS
293 return static_cast<::DWORD>(event) <= CTRL_SHUTDOWN_EVENT;
294#else
295 int v = static_cast<int>(event);
296 return v > 0 && v < 64;
297#endif
298 }
299};
300
308public:
315
322
323 signal_guard(const signal_guard&) = delete;
324 signal_guard& operator=(const signal_guard&) = delete;
325 signal_guard(signal_guard&&) = delete;
326 signal_guard& operator=(signal_guard&&) = delete;
327};
328 // SystemSignal
330
331NEFORCE_END_NAMESPACE__
332#endif // NEFORCE_CORE_SYSTEM_SIGNAL_HPP__
原子类型完整实现
函数包装器主模板声明
信号守卫
signal_guard()
构造函数
~signal_guard()
析构函数
void set_force_exit_timeout(int timeout_ms)
设置强制退出超时时间
bool block_signals(const vector< event > &signals_to_block) const
阻塞指定信号(仅Linux)
event
信号事件枚举
function< bool(event, void *)> signal_handler
信号处理函数类型
bool is_running() const
检查是否正在运行
void remove_handler(event event)
移除信号处理函数
void start_monitoring()
启动信号监控
void register_handlers(const vector< event > &events, const signal_handler &handler)
批量注册信号处理函数
void send_signal(event event, void *context=nullptr)
发送信号
void stop_monitoring() noexcept
停止信号监控
static bool is_platform_signal(event event)
判断事件是否为平台原生信号
bool unblock_signals(const vector< event > &signals_to_unblock) const
解除阻塞指定信号(仅Linux)
void reset_force()
强制重置信号管理器状态
static system_signal_manager & instance()
获取单例实例
event wait_for_signal(int timeout_ms=-1)
等待信号
void register_handler(event event, signal_handler handler)
注册信号处理函数
时间戳类
动态大小数组容器
条件变量行为
通用函数包装器
constexpr T initialize() noexcept(is_nothrow_default_constructible< T >::value)
返回类型T的默认初始化值
_NEFORCE time_point< steady_clock > time_point
时间点类型
系统事件同步原语
线程管理类
无序映射容器
动态大小数组容器