Выполнение эквивалента «Уничтожить дерево процессов» на C++ в Windows

StackOverflow https://stackoverflow.com/questions/604522

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Если вы не можете пойти по маршруту объекта задания, вы можете использовать API-интерфейс Toolhelp, чтобы получить идентификаторы родительских процессов и построить дерево таким образом.Однако будьте осторожны, поскольку в 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));

В Win32 есть функция под названием ЗавершитьПроцесс().Он должен сделать всю работу за вас.

Альтернативно, я обнаружил, что команда 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.

-Джон

Вы хотите найти идентификатор процесса, который хотите убить, затем «пройтись по дереву» его дочерних элементов (и их дочерних элементов и т. д.), записать их идентификаторы, а затем красиво и быстро убить все процессы. .

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top