Выполнение эквивалента «Kill Process Tree» в C ++ на окнах - PullRequest
14 голосов
/ 03 марта 2009

У нас есть задача C ++, которая будет форкать новый процесс. Этот процесс в свою очередь может иметь несколько дочерних процессов. Если задача выполняется за отведенное время, мы захотим завершить этот разветвленный процесс.

Однако мы не хотим осиротеть процессы, которые он породил. Мы хотим, чтобы они все умерли. Я использовал Process Explorer, и у него есть опция «Kill Process Tree», аналогичная «Конечному дереву» диспетчера задач Windows, поэтому я предполагаю / предполагаю, что для этого существует публичный API. Кто-нибудь делал это или знает ссылку на публичный API, который это делает?

Ответы [ 5 ]

20 голосов
/ 03 марта 2009

Возможно, вы захотите рассмотреть «API заданий». CreateJobObject и друзья. Вы можете принудительно заставить дочерние процессы оставаться в задании, установив соответствующий атрибут. Тогда вы можете позвонить TerminateJobObject, когда захотите.

Уточнение: это НЕ то, что делает диспетчер задач.

6 голосов
/ 03 марта 2009

Я предлагаю пройти маршрут объекта задания, как указано выше, он будет наиболее надежным.

Если вы не можете пройти маршрут объекта задания, вы можете использовать API-интерфейс всплывающей подсказки, чтобы получить идентификаторы родительского процесса и построить дерево таким образом. Будьте осторожны, поскольку в 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));
5 голосов
/ 03 марта 2009

Существует функция Win32 с именем TerminateProcess () . Это должно сделать работу за вас.

Кроме того, я обнаружил, что команда taskkill может быть полезна для подобных вещей.

из командной строки:

taskkill /F /T /IM program.exe

из кода:

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

другие переключатели (прямо с taskkill /?):

 TASKKILL [/S system [/U username [/P
 [password]]]]
          { [/FI filter] [/PID processid | /IM imagename] } [/F] [/T]

 Description:
     This command line tool can be used to end one or more processes.
     Processes can be killed by the process id or image name.

 Parameter List:
     /S    system           Specifies the remote system to connect to.

     /U    [domain\]user    Specifies the user context under which
                            the command should execute.

     /P    [password]       Specifies the password for the given
                            user context. Prompts for input if omitted.

     /F                     Specifies to forcefully terminate
                            process(es).

     /FI   filter           Displays a set of tasks that match a
                            given criteria specified by the filter.

     /PID  process id       Specifies the PID of the process that
                            has to be terminated.

     /IM   image name       Specifies the image name of the process
                            that has to be terminated. Wildcard '*'
                            can be used to specify all image names.

     /T                     Tree kill: terminates the specified process
                            and any child processes which were started by it.

     /?                     Displays this help/usage.

-John

1 голос
/ 03 марта 2009

Вы хотите найти идентификатор процесса для процесса, который хотите убить, затем "пройтись по дереву" его дочерних элементов (и их дочерних элементов и т. Д.), Записать их pids и затем уничтожить все процессы красиво и быстро.

0 голосов
/ 03 марта 2009

Вы также можете использовать WMI, планирование маршрута, вы можете создать класс для выполнения задач.
Вот это «Где найти документацию по WMI?»
и библиотека WMI COM
и Примеры применения WMI C ++

...