From efbc5830433db1082017e66588ec8759a3b31d28 Mon Sep 17 00:00:00 2001 From: nanako <469449812@qq.com> Date: Tue, 4 Nov 2025 01:25:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=BF=9B=E7=A8=8B=E7=AE=A1?= =?UTF-8?q?=E7=90=86=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=86=85=E9=83=A8=E7=BB=88?= =?UTF-8?q?=E6=AD=A2=E6=96=B9=E6=B3=95=E4=BB=A5=E9=81=BF=E5=85=8D=E6=AD=BB?= =?UTF-8?q?=E9=94=81=EF=BC=8C=E8=B0=83=E6=95=B4=E8=BF=9B=E7=A8=8B=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91=EF=BC=8C=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=B5=8B=E8=AF=95=E8=84=9A=E6=9C=AC=E4=BB=A5=E5=BB=B6?= =?UTF-8?q?=E9=95=BF=E8=BF=90=E8=A1=8C=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/process_manager/process_manager.cpp | 27 ++++++++++++++----- src/process_manager/process_manager.h | 7 +++++ .../process_manager/test_process_manager.cpp | 15 +++++------ 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/process_manager/process_manager.cpp b/src/process_manager/process_manager.cpp index b3ad675..d05e14d 100644 --- a/src/process_manager/process_manager.cpp +++ b/src/process_manager/process_manager.cpp @@ -98,8 +98,9 @@ uint32_t process_manager::launch_process_internal( return 0; } - // 更新进程状态 - process_info_ptr->state = process_state::RUNNING; + // 保持STARTING状态,让监控器检测后更新为RUNNING + // 这样可以触发状态变化回调 + // process_info_ptr->state = process_state::RUNNING; // 添加进程到管理列表 processes_[process_id] = std::move(process_info_ptr); @@ -131,6 +132,15 @@ process_error process_manager::terminate_process( std::chrono::milliseconds timeout_ms ) { std::lock_guard lock(manager_mutex_); + return terminate_process_internal(process_id, force, timeout_ms); +} + +process_error process_manager::terminate_process_internal( + uint32_t process_id, + bool force, + std::chrono::milliseconds timeout_ms +) { + // 注意:调用此方法时必须已经持有manager_mutex_锁! // 查找进程信息 auto it = processes_.find(process_id); @@ -203,7 +213,7 @@ process_error process_manager::terminate_process( process_info->state = process_state::STOPPED; process_info->exit_code = process_info->process->exit_code(); - log_module_info(PROCESS_MANAGER_LOG_MODULE, "进程已终止: ID={}, 退出码={}", + log_module_info(PROCESS_MANAGER_LOG_MODULE, "进程已终止: ID={}, 退出码={}", process_id, process_info->exit_code); // 移除监控器 @@ -211,6 +221,10 @@ process_error process_manager::terminate_process( monitors_.erase(monitor_it); } + // 立即从映射中移除已终止的进程 + processes_.erase(it); + log_module_debug(PROCESS_MANAGER_LOG_MODULE, "已从进程列表中除: ID={}", process_id); + return process_error::SUCCESS; } catch (const std::exception& e) { @@ -235,9 +249,9 @@ process_error process_manager::terminate_all_processes( process_ids.push_back(pair.first); } - // 终止所有进程 + // 终止所有进程 - 使用内部方法避免死锁 for (uint32_t id : process_ids) { - process_error err = terminate_process(id, force, timeout_ms); + process_error err = terminate_process_internal(id, force, timeout_ms); if (err != process_error::SUCCESS && err != process_error::PROCESS_NOT_RUNNING) { result = err; } @@ -246,8 +260,7 @@ process_error process_manager::terminate_all_processes( // 清理所有监控器 monitors_.clear(); - // 清理无效的进程记录 - cleanup_processes(); + // 注意:进程记录已在terminate_process_internal中移除,无需再次清理 log_module_info(PROCESS_MANAGER_LOG_MODULE, "所有进程终止操作完成"); return result; diff --git a/src/process_manager/process_manager.h b/src/process_manager/process_manager.h index 8655783..b21765c 100644 --- a/src/process_manager/process_manager.h +++ b/src/process_manager/process_manager.h @@ -146,6 +146,13 @@ private: bool monitor ); + // 终止进程的内部方法(不加锁,供terminate_all_processes调用) + process_error terminate_process_internal( + uint32_t process_id, + bool force, + std::chrono::milliseconds timeout_ms + ); + // 创建进程监控器 void create_process_monitor(process_info& process); diff --git a/tests/process_manager/test_process_manager.cpp b/tests/process_manager/test_process_manager.cpp index 2a08638..f570dd5 100644 --- a/tests/process_manager/test_process_manager.cpp +++ b/tests/process_manager/test_process_manager.cpp @@ -83,18 +83,17 @@ std::string create_test_executable() { std::string exe_path; #ifdef _WIN32 - exe_path = "test_process.exe"; - std::ofstream bat_file("test_process.bat"); - bat_file << "@echo off\n"; - bat_file << "timeout /t 2 /nobreak > nul\n"; // 运行2秒然后退出 - bat_file << "exit 0\n"; - bat_file.close(); exe_path = "test_process.bat"; + std::ofstream bat_file(exe_path); + bat_file << "@echo off\n"; + bat_file << "ping 127.0.0.1 -n 6 > nul\n"; // 运行约5秒,给监控器足够时间 + bat_file << "exit /b 0\n"; + bat_file.close(); #else exe_path = "./test_process.sh"; std::ofstream script_file(exe_path); script_file << "#!/bin/bash\n"; - script_file << "sleep 2\n"; // 运行2秒然后退出 + script_file << "sleep 5\n"; // 运行5秒然后退出 script_file << "exit 0\n"; script_file.close(); @@ -113,7 +112,7 @@ std::string create_failing_executable() { exe_path = "test_fail_process.bat"; std::ofstream bat_file(exe_path); bat_file << "@echo off\n"; - bat_file << "exit 1\n"; // 立即以错误码退出 + bat_file << "exit /b 1\n"; // 立即以错误码退出 bat_file.close(); #else exe_path = "./test_fail_process.sh";