我们有一个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 ++应用程序示例