在Windows上执行相当于“杀死进程树”的c ++

我们有一个c ++的任务,将分叉新的进程。 这个过程又可能有几个subprocess。 如果任务运行超过了分配的时间,我们将要杀死分叉的进程。 但是,我们不希望孤立它所产生的进程。 我们希望他们都死亡。 我已经使用过程资源pipe理器,它有一个“杀死进程树”选项,类似于Windows任务pipe理器的“结束进程树”,所以我猜/假设有一个公共API来做到这一点。 有没有人做过这个,或者知道对公共API的引用呢?

Thx,Brett

您可能要考虑“工作API”。 CreateJobObject和朋友。 通过设置适当的属性,您可以强制子进程留在作业中。 然后你可以随时调用TerminateJobObject。

澄清:这不是什么任务管理器。

我建议去工作对象的路线,如上所述,这将是最可靠的。 如果你不能去作业对象路线,你可以使用toolhelp API获取父进程ID,并以这种方式构建树。 但要小心,因为Windows没有很强的父母/孩子关系,并且PID有可能被回收。 您可以使用GetProcessTimes查询进程的创建时间,并检查它是否比子进程更早。 如果树中的一个中间进程被终止,你将无法进一步行走树。

// Error handling removed for brevity HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 process; ZeroMemory(&process, sizeof(process)); process.dwSize = sizeof(process); Process32First(snapshot, &process); do { // process.th32ProcessId is the PID. // process.th32ParentProcessID is the parent PID. } while (Process32Next(snapshot, &process)); 

有一个称为TerminateProcess()的Win32函数。 它应该为你做这个工作。

另外,我发现taskkill命令对于像这样的事情是有用的。

从命令行:

 taskkill /F /T /IM program.exe 

从代码:

 system("taskkill /F /T /IM program.exe"); 

其他开关(直接从taskkill /?):

  TASKKILL [/ S系统[/ U用户名[/ P
  [密码]]]]
           {[/ FI filter] [/ PID processid |  / IM imagename]} [/ F] [/ T]

 描述:
     这个命令行工具可以用来结束一个或多个进程。
     进程可以被进程ID或图像名称杀死。

 参数列表:
      / S系统指定要连接的远程系统。

      / U [domain \] user指定在其下的用户上下文
                            该命令应该执行。

      / P [密码]指定给定的密码
                            用户上下文。 提示输入,如果省略。

      / F指定强制终止
                            过程(ES)。

      / FI过滤器显示一组与任务匹配的任务
                            给定的过滤器指定的标准。

      / PID进程标识指定进程的PID
                            必须被终止。

      / IM图像名称指定进程的图像名称
                            那必须被终止。 通配符'*'
                            可以用来指定所有的图像名称。

      / T树杀:终止指定的进程
                            以及由此启动的任何子进程。

      /? 显示此帮助/用法。 

-约翰

你想找到你要杀死的进程的进程ID,然后找到它的孩子(和他们的孩子,等等……)的“走树”,记下他们的pid,然后快速杀死所有的进程。

你也可以使用WMI,路由规划你可以创建一个类来执行任务。
这个“我在哪里可以找到WMI文档?”
和WMI COM库
和WMI C ++应用程序示例