16

我们有一个 C++ 任务,它将派生一个新进程。该进程又可能有几个子进程。如果任务运行超过了分配的时间,我们将要终止该分叉进程。

但是,我们不想孤立它产生的进程。我们希望他们都死去。我使用了 Process Explorer,它有一个“Kill Process Tree”选项,类似于 Windows 任务管理器的“End Process Tree”,所以我猜测/假设有一个公共 API 可以做到这一点。有没有人这样做,或者知道对公共 API 的引用?

4

5 回答 5

20

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

澄清:这不是任务管理器所做的。

于 2009-03-02T23:39:29.717 回答
6

我建议走工作对象路线,如上所述,它将是最可靠的。

如果您无法执行作业对象路径,则可以使用 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));
于 2009-03-03T00:01:37.123 回答
5

有一个名为TerminateProcess()的 Win32 函数。它应该为您完成这项工作。

或者,我发现 taskkill 命令对这样的事情很有用。

从命令行:

taskkill /F /T /IM program.exe

来自代码:

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

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

TASKKILL [/S系统[/U用户名[/P
 [密码]]]]
          { [/FI 过滤器] [/PID 进程 ID | /IM 图像名] } [/F] [/T]

 描述:
     此命令行工具可用于结束一个或多个进程。
     进程可以通过进程 ID 或图像名称来终止。

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

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

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

     /F 指定强制终止
                            进程。

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

     /PID 进程 ID 指定进程的 PID
                            必须终止。

     /IM image name 指定进程的镜像名称
                            必须终止。通配符 '*'
                            可用于指定所有图像名称。

     /T Tree kill:终止指定进程
                            以及由它启动的任何子进程。

     /?显示此帮助/用法。

-约翰

于 2009-03-02T23:49:32.017 回答
1

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

于 2009-03-02T23:53:35.987 回答
0

您还可以使用 WMI,路线规划您可以创建一个类来执行任务。
请参阅此“我在哪里可以找到 WMI 文档?”
WMI COM 库
WMI C++ 应用程序示例

于 2009-03-03T00:15:06.637 回答