C++如何终止std::system执行的tree命令并返回main函数(无需Ctrl+C)
解决方法
你现有代码的核心问题是:std::system("tree C:\\")是阻塞调用,它会一直等到tree命令完全执行完毕,才会回到while循环检查退格键。这意味着在tree输出目录树的过程中,你的程序根本没在监听按键,自然没法中途终止;而Ctrl+C会向整个进程组发送中断信号,直接导致主程序跟着退出。
要实现无需Ctrl+C就能终止tree命令并返回主线程,你需要手动创建子进程执行tree,同时保留进程句柄,这样就能在检测到按键时主动终止子进程。以下是具体实现代码:
#include <windows.h> #include <iostream> void tree() { std::system("cls"); // 子进程相关结构初始化 STARTUPINFO si = {sizeof(si)}; PROCESS_INFORMATION pi; // 启动tree命令的子进程,通过cmd.exe执行 BOOL created = CreateProcess( NULL, (LPSTR)"cmd.exe /c tree C:\\", // /c参数让cmd执行命令后自动退出 NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); if (!created) { std::cerr << "启动tree进程失败!" << std::endl; return; } // 循环监听按键+检查子进程状态 while (true) { // 检测退格键是否被按下 if (GetKeyState(VK_BACK) & 0x8000) { // 强制终止子进程 TerminateProcess(pi.hProcess, 0); break; } // 检查子进程是否已经自然执行完毕 DWORD exitCode; if (GetExitCodeProcess(pi.hProcess, &exitCode) && exitCode != STILL_ACTIVE) { break; } // 短暂休眠,避免占用过高CPU Sleep(50); } // 释放进程和线程句柄,避免资源泄漏 CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } // 示例主线程 int main() { tree(); std::cout << "\n回到主线程" << std::endl; return 0; }
关键细节说明:
- 用
CreateProcess替代std::system,能获取子进程的句柄,实现对子进程的主动控制。 - 循环中同时完成两个逻辑:监听退格键、检查子进程是否自然结束。
- 按下退格键时,调用
TerminateProcess终止子进程,直接退出循环回到主线程。 - 最后必须关闭进程和线程句柄,避免系统资源泄漏。
修改后,你在tree命令输出过程中按下退格键,就能立刻终止目录树输出,直接回到主程序,完全不需要用Ctrl+C。
内容的提问来源于stack exchange,提问作者AzGames
相关产品推荐
相关产品推荐

