NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
process.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_SYSTEM_PROCESS_HPP__
2#define NEFORCE_CORE_SYSTEM_PROCESS_HPP__
3
10
15NEFORCE_BEGIN_NAMESPACE__
16
22
27struct process_exception final : system_exception {
28 explicit process_exception(const char* info = "Process Operation Failed.", const char* type = static_type,
29 const int code = 0) noexcept :
30 system_exception(info, type, code) {}
31
32 explicit process_exception(const exception& e) :
33 system_exception(e) {}
34
35 ~process_exception() override = default;
36 static constexpr auto static_type = "process_exception";
37};
38 // Exceptions
40
46
63class NEFORCE_API process {
64public:
69#ifdef NEFORCE_PLATFORM_WINDOWS
70 unsigned long;
71#else
72 int;
73#endif
74
81 struct memory_info {
82 size_t working_set_size{0};
84 size_t pagefile_usage{0};
86 };
87
99
104 enum class state {
105 running,
106 suspended,
107 stopped,
108 exited,
109 unknown
110 };
111
116 enum class permission {
117 read = 0x01,
118 write = 0x02,
119 execute = 0x04,
120 terminate = 0x08,
121 query_info = 0x10,
122 all = 0xFF
123 };
124
129 enum class privilege_level {
130 privileged,
131 not_privileged,
132 unknown
133 };
134
138 enum class elevation_tool {
139 auto_,
140 sudo,
141 pkexec
142 };
143
150 string output;
151 };
152
153private:
154 void reader_loop();
155
156 void close_handles() noexcept;
157
158 native_id_type process_id_{0};
159 int exit_code_{-1};
160 bool started_{false};
161 bool finished_{false};
162
163 string work_dir_;
164 vector<pair<string, string>> env_vars_;
165 bool capture_stdout_{false};
166 bool capture_stderr_{false};
167 string stdin_data_;
168
169 pipe stdout_pipe_;
170 pipe stderr_pipe_;
171 pipe stdin_pipe_;
172
173 string stdout_buf_;
174 string stderr_buf_;
175
176 thread reader_thread_;
177 atomic<bool> reader_running_{false};
178
179#ifdef NEFORCE_PLATFORM_WINDOWS
180 void* process_handle_{nullptr};
181 void* thread_handle_{nullptr};
182#endif
183
184public:
190 process() = default;
191
198
199 process(const process&) = delete;
200 process& operator=(const process&) = delete;
201
205 process(process&& other) noexcept;
206
210 process& operator=(process&& other) noexcept;
211
216 process& set_work_dir(const string& dir);
217
223 process& set_env(const string& key, const string& value);
224
230
236
241 process& set_stdin_data(const string& data);
242
249 void start(const string& executable, const vector<string>& args = {});
250
259 void start_elevated(const string& executable, const vector<string>& args = {},
260 elevation_tool tool = elevation_tool::auto_);
261
268 int wait(int timeout_ms = -1);
269
271 void terminate();
272
274 void suspend();
275
277 void resume();
278
280 void close() noexcept;
281
283 NEFORCE_NODISCARD bool is_running() const;
284
286 NEFORCE_NODISCARD state get_state() const;
287
289 NEFORCE_NODISCARD memory_info get_memory_info() const;
290
292 NEFORCE_NODISCARD native_id_type id() const noexcept { return process_id_; }
293
295 NEFORCE_NODISCARD int exit_code() const noexcept { return exit_code_; }
296
298 NEFORCE_NODISCARD const string& stdout_output() const noexcept { return stdout_buf_; }
299
301 NEFORCE_NODISCARD const string& stderr_output() const noexcept { return stderr_buf_; }
302
304 void write_stdin(const string& data);
305
308
316 NEFORCE_NODISCARD static shell_result execute_shell(const string& command, int timeout_ms = -1);
317
327 static shell_result execute_elevated_shell(const string& command, int timeout_ms = -1,
329
331 NEFORCE_NODISCARD static native_id_type current_id() noexcept;
332
334 NEFORCE_NODISCARD static privilege_level current_privilege_level() noexcept;
335
341 NEFORCE_NODISCARD static string name(native_id_type process_id);
342
347 NEFORCE_NODISCARD static memory_info get_memory_info(native_id_type process_id);
348
353 NEFORCE_NODISCARD static state get_state(native_id_type process_id);
354
359 NEFORCE_NODISCARD static privilege_level get_privilege_level(native_id_type process_id);
360
367 NEFORCE_NODISCARD static bool check_permission(native_id_type process_id, permission perm);
368};
369 // Process
371
372NEFORCE_END_NAMESPACE__
373#endif // NEFORCE_CORE_SYSTEM_PROCESS_HPP__
原子类型完整实现
static privilege_level get_privilege_level(native_id_type process_id)
获取指定进程的特权级别
void start_elevated(const string &executable, const vector< string > &args={}, elevation_tool tool=elevation_tool::auto_)
以管理员/root 权限启动子进程
elevation_tool
提权工具选择
int wait(int timeout_ms=-1)
等待子进程退出
process & set_stdin_data(const string &data)
预设要写入子进程 stdin 的数据
static shell_result execute_shell(const string &command, int timeout_ms=-1)
执行 shell 命令并获取输出
state
进程状态枚举
memory_info get_memory_info() const
获取子进程内存信息
void close() noexcept
显式关闭进程句柄并清理资源
void close_stdin()
关闭子进程的 stdin
process & set_capture_stdout(bool v=true)
捕获标准输出
static shell_result execute_elevated_shell(const string &command, int timeout_ms=-1, elevation_tool tool=elevation_tool::auto_)
以管理员/root 权限执行 shell 命令
static native_id_type current_id() noexcept
获取当前进程 ID
void suspend()
挂起子进程
~process()
析构
bool is_running() const
子进程是否正在运行
void start(const string &executable, const vector< string > &args={})
启动子进程
int exit_code() const noexcept
子进程退出码(仅在 wait() 返回后有效)
const string & stderr_output() const noexcept
获取捕获的标准错误
process & operator=(process &&other) noexcept
移动赋值
static privilege_level current_privilege_level() noexcept
获取当前进程的特权级别
process & set_work_dir(const string &dir)
设置子进程工作目录
privilege_level
进程特权级别
static bool check_permission(native_id_type process_id, permission perm)
检查对指定进程的访问权限
state get_state() const
获取子进程状态
void write_stdin(const string &data)
向子进程的 stdin 写入数据
process & set_env(const string &key, const string &value)
设置子进程环境变量
const string & stdout_output() const noexcept
获取捕获的标准输出
process & set_capture_stderr(bool v=true)
捕获标准错误
unsigned long native_id_type
进程ID类型
void terminate()
终止子进程(SIGTERM → 短暂等待 → SIGKILL)
process(process &&other) noexcept
移动构造
permission
进程权限枚举
void resume()
恢复子进程
static string name(native_id_type process_id)
根据进程 ID 获取进程名称
process()=default
默认构造
动态大小数组容器
unsigned long long uint64_t
64位无符号整数类型
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
跨平台管道封装
exception(const char *info=static_type, const char *type=static_type, const int code=0)
构造函数
const char * type() const noexcept
获取异常类型
int code() const noexcept
获取异常码
进程内存信息
shell 命令执行结果
进程时间信息
线程管理类
动态大小数组容器