c - 终止进程树(Windows 的 C)

标签 c windows process terminate

之前有人问过这个问题,但我无法在代码中找到明确的答案。

我打开一个进程,ProcessA(PID 1234)。该进程打开一个子进程 ProcessAB (PID 5678)。 完成后,我终止了 ProcessA,但 ProcessAB 仍然挥之不去。

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

谢谢

感谢代码。

最佳答案

检查 this thread用于在“作业”中对流程进行分组。

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

  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);
    }       
}

关于c - 终止进程树(Windows 的 C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24751633/

相关文章:

c - 将数组传递给函数而无需事先显式声明数组

windows - 由于 Windows Appium 检查器不起作用,我如何在 Windows 上找到 native android 应用程序的元素?

process - 堆栈内存如何增加?

安卓子网扫描

windows - 获取特定驱动器的 GUID

java - 将变量传递给java进程

c++ - 使用C调用动态Cpp库

规范模式 Linux 串口

c++ - 我的字符串复制函数中这两个 while 循环条件之间的区别

windows - 在 Go 中调用 SHGetImageList