终止进程树(C for Windows)

won*_*rer 11 c windows process terminate

以前曾经问过,但我在代码中找不到明确的答案.

我打开一个进程,ProcessA(带有PID 1234).此过程打开子进程ProcessAB(PID 5678).在我完成后,我终止了ProcessA,但我仍然有ProcessAB的挥之不去.

如何终止整个进程树?我的意思是,我如何确保如果我终止我打开的流程,我也会终止所有相关流程?

谢谢

代码表示赞赏.

Mik*_*all 12

检查此线程是否在"作业"中对进程进行分组.

如果这对您不起作用,本土方法可能如下:

  1. 获取您的主进程ID
  2. 调用CreateToolhelp32Snapshot以枚举系统上的所有进程
  3. 检查每个进程上PROCESSENTRY32结构的th32ParentProcessID成员,如果它与您的父ID匹配,则终止进程(使用TerminateProcess)
  4. 终止所有孩子后,终止主要过程

示例代码:

    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);
    }       
}
Run Code Online (Sandbox Code Playgroud)


小智 5

使用作业对象.

这是Windows提供的unix'进程组'最接近的事情.

作业对象允许您指示子进程(及其所有子进程)可以一起管理,尤其是.因为被杀 与unix不同,在撰写本文时,"作业对象" 不能嵌套.这意味着如果父母为孩子创建了一个工作对象,那么孩子的所有孩子都不能自己使用工作对象(这是一个/严重/限制恕我直言,就像只允许一级子目录的文件系统).

  • Windows 8和Windows Server 2012中添加了对嵌套作业对象的支持. (4认同)