我们有一个C ++任务,它将分叉一个新进程。反过来,这个过程可能有几个子进程。如果任务超过规定的时间,我们将要杀死该分叉的进程。

但是,我们不希望孤立它产生的进程。我们希望他们都死了。我使用了Process Explorer,它有一个“Kill Process Tree”。选项,类似于Windows任务管理器的“结束进程树”,所以我猜/假设有一个公共API来执行此操作。有没有人这样做过,或者知道对公共API的引用呢?

有帮助吗?

解决方案

您可能需要考虑“Jobs 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));

您想要找到要杀死的进程的进程ID,然后“走树”。它的孩子(和他们的孩子,等等......),注意他们的pids,然后快速杀死所有的过程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top