以前曾有人问过这个问题,但我在代码中找不到明确的答案。
我打开一个进程 ProcessA(PID 为 1234)。此进程打开一个子进程 ProcessAB (PID 5678)。
完成后,我终止了 ProcessA,但 ProcessAB 仍然存在。
如何终止整个进程树?我的意思是,如何确保如果我终止打开的进程,我也会终止所有关联的进程?
Thanks
代码受到赞赏。
Check 这个线程 https://stackoverflow.com/questions/604522/performing-equivalent-of-kill-process-tree-in-c-on-windows用于将进程分组到“作业”中。
如果这对您不起作用,则可以采用以下自行开发的方法:
- 获取你的主进程ID
- Call 创建Toolhelp32Snapshot http://msdn.microsoft.com/en-us/library/ms682489(VS.85).aspx枚举系统上的所有进程
- 检查每个进程上 PROCESSENTRY32 结构的 th32ParentProcessID 成员,如果它与您的父 ID 匹配,则终止该进程(使用终止进程 http://msdn.microsoft.com/en-us/library/ms686714%28VS.85%29.aspx)
- 所有子进程终止后,终止主进程
示例代码:
DWORD myprocID = 1234; // your main process id
PROCESSENTRY32 pe;
memset(&pe, 0, sizeof(PROCESSENTRY32));
pe.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnap = :: CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (::Process32First(hSnap, &pe))
{
BOOL bContinue = TRUE;
// kill child processes
while (bContinue)
{
// only kill child processes
if (pe.th32ParentProcessID == myprocID)
{
HANDLE hChildProc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
if (hChildProc)
{
::TerminateProcess(hChildProc, 1);
::CloseHandle(hChildProc);
}
}
bContinue = ::Process32Next(hSnap, &pe);
}
// kill the main process
HANDLE hProc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, myprocID);
if (hProc)
{
::TerminateProcess(hProc, 1);
::CloseHandle(hProc);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)