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_COMPILER_MSVC
18# include <consoleapi.h>
19#endif
20#ifdef NEFORCE_COMPILER_MINGW
21# include <windef.h>
22# include <wincon.h>
23#endif
24#ifdef NEFORCE_PLATFORM_LINUX
25# include <csignal>
26#endif
27NEFORCE_BEGIN_NAMESPACE__
28
34
42enum class signal_event {
43#ifdef NEFORCE_PLATFORM_WINDOWS
44 INTERRUPT = CTRL_C_EVENT,
45 CTRL_BREAK = CTRL_BREAK_EVENT,
46 CLOSE = CTRL_CLOSE_EVENT,
47 LOGOFF = CTRL_LOGOFF_EVENT,
48 SHUTDOWN = CTRL_SHUTDOWN_EVENT,
49
50 TERMINATE = 1000,
51 ABORT = 1001,
52 ILLEGAL_INSTR = 1002,
53 FLOATING_POINT = 1003,
54 SEGMENT_FAULT = 1004,
55 BUS_ERROR = 1005,
56 PIPE_BROKEN = 1006,
57 ALARM = 1007,
58 HANGUP = 1008,
59 USER1 = 1009,
60 USER2 = 1010,
61
62 TIMEOUT = 2000,
63 CUSTOM_1 = 2001,
64 CUSTOM_2 = 2002,
65 FORCE_EXIT = 9999
66#else
67 INTERRUPT = SIGINT,
68 TERMINATE = SIGTERM,
69 ABORT = SIGABRT,
70 ILLEGAL_INSTR = SIGILL,
71 FLOATING_POINT = SIGFPE,
72 SEGMENT_FAULT = SIGSEGV,
73 BUS_ERROR = SIGBUS,
74 PIPE_BROKEN = SIGPIPE,
75 ALARM = SIGALRM,
76 HANGUP = SIGHUP,
77 USER1 = SIGUSR1,
78 USER2 = SIGUSR2,
79
80 CTRL_BREAK = 1000,
81 CLOSE = 1001,
82 LOGOFF = 1002,
83 SHUTDOWN = 1003,
84
85 TIMEOUT = 2000,
86 CUSTOM_1 = 2001,
87 CUSTOM_2 = 2002,
88 FORCE_EXIT = 9999
89#endif
90};
91
92
107class NEFORCE_API signal_manager {
108public:
114 using signal_handler = function<bool(signal_event, void*)>;
115
116private:
121 struct signal_result {
122 signal_event event;
123 void* context;
124 };
125
130 struct pending_signal {
131 signal_event event;
132 void* context;
134
135 pending_signal(const signal_event event, void* context, steady_clock::time_point timestamp) :
136 event{event},
137 context{context},
139 };
140
141 atomic<bool> running_{false};
142 atomic<bool> force_exit_{false};
143 atomic<int> force_exit_timeout_{5000};
144
145 mutex mutex_;
146 condition_variable cv_;
147
148 unordered_map<signal_event, signal_handler> handlers_;
149 vector<pending_signal> pending_signals_;
150
151#ifdef NEFORCE_PLATFORM_WINDOWS
152 vector<::DWORD> registered_windows_events_;
153#else
154 struct ::sigaction old_actions_[64]{};
155 ::timer_t alarm_timer_{nullptr};
156#endif
157
158 thread signal_thread_;
159 thread timeout_thread_;
160
161private:
162 void initialize_platform();
163 void cleanup_platform() const;
164
165 void signal_thread_func();
166 void timeout_monitor_thread();
167
168 void process_signal(signal_event event, void* context = nullptr);
169
170 signal_result wait_for_signal_internal(int timeout_ms = -1);
171 void send_signal_nolock(signal_event event, void* context = nullptr);
172
173 signal_manager();
174
175public:
176 signal_manager(const signal_manager&) = delete;
177 signal_manager& operator=(const signal_manager&) = delete;
178 signal_manager(const signal_manager&&) = delete;
179 signal_manager& operator=(const signal_manager&&) = delete;
180
185
190 static signal_manager& instance() {
191 static signal_manager instance;
192 return instance;
193 }
194
202
208 void register_handlers(const vector<signal_event>& events, const signal_handler& handler);
209
215
223 signal_event wait_for_signal(int timeout_ms = -1);
224
230 void send_signal(signal_event event, void* context = nullptr);
231
238 void set_force_exit_timeout(int timeout_ms);
239
246
253
258 NEFORCE_NODISCARD bool is_running() const;
259
265 bool block_signals(const vector<signal_event>& signals_to_block) const;
266
272 bool unblock_signals(const vector<signal_event>& signals_to_unblock) const;
273
279 NEFORCE_NODISCARD static bool is_platform_signal(signal_event event) {
280#ifdef NEFORCE_PLATFORM_WINDOWS
281 return static_cast<::DWORD>(event) <= CTRL_SHUTDOWN_EVENT;
282#else
283 const int value = static_cast<int>(event);
284 return value > 0 && value < 64 && value != SIGALRM;
285#endif
286 }
287};
288
289
312 // SystemSignal
314
315NEFORCE_END_NAMESPACE__
316#endif // NEFORCE_CORE_SYSTEM_SIGNAL_HPP__
原子类型完整实现
函数包装器主模板声明
signal_guard()
构造函数
~signal_guard()
析构函数
function< bool(signal_event, void *)> signal_handler
信号处理函数类型
void register_handler(signal_event event, signal_handler handler)
注册信号处理函数
NEFORCE_NODISCARD bool is_running() const
检查是否正在运行
bool unblock_signals(const vector< signal_event > &signals_to_unblock) const
解除信号阻塞
void register_handlers(const vector< signal_event > &events, const signal_handler &handler)
批量注册信号处理函数
static NEFORCE_NODISCARD bool is_platform_signal(signal_event event)
检查是否为平台原生信号
bool block_signals(const vector< signal_event > &signals_to_block) const
阻塞信号
void set_force_exit_timeout(int timeout_ms)
设置强制退出超时时间
~signal_manager()
析构函数
signal_event wait_for_signal(int timeout_ms=-1)
等待信号
void start_monitoring()
启动信号监控
void send_signal(signal_event event, void *context=nullptr)
发送信号
void stop_monitoring()
停止信号监控
static signal_manager & instance()
获取单例实例
void remove_handler(signal_event event)
移除信号处理函数
时间戳类
动态大小数组容器
条件变量行为
通用函数包装器
signal_event
信号事件枚举
@ USER2
用户自定义信号2
@ TIMEOUT
超时事件
@ TERMINATE
终止信号
@ FLOATING_POINT
浮点异常
@ HANGUP
挂起信号
@ BUS_ERROR
总线错误
@ PIPE_BROKEN
管道破裂
@ CLOSE
关闭事件(模拟)
@ ILLEGAL_INSTR
非法指令
@ INTERRUPT
Ctrl+C中断信号
@ ABORT
中止信号
@ SEGMENT_FAULT
段错误
@ CTRL_BREAK
Ctrl+Break(模拟)
@ CUSTOM_1
自定义事件1
@ ALARM
定时器信号
@ USER1
用户自定义信号1
@ LOGOFF
注销事件(模拟)
@ CUSTOM_2
自定义事件2
@ SHUTDOWN
关机事件(模拟)
@ FORCE_EXIT
强制退出信号
_NEFORCE time_point< steady_clock > time_point
时间点类型
线程管理类
无序映射容器
动态大小数组容器