Выполнение эквивалента "Kill Process Tree" в C++ на окнах
У нас есть задача C++, которая запустит новый процесс. Этот процесс в свою очередь может иметь несколько дочерних процессов. Если задача выполняется за отведенное время, мы хотим уничтожить этот разветвленный процесс.
Однако мы не хотим осиротеть процессы, которые он породил. Мы хотим, чтобы они все умерли. Я использовал Process Explorer, и у него есть опция "Kill Process Tree", аналогичная Windows Task Manager "End Process Tree", поэтому я предполагаю/предполагаю, что для этого существует общедоступный API. Кто-нибудь сделал это, или знает ссылку на публичный API, который делает?
Ответы
Ответ 1
Возможно, вы захотите рассмотреть "Jobs API". CreateJobObject
и друзей. Вы можете принудительно заставить дочерние процессы оставаться в задании, установив соответствующий атрибут. Затем вы можете вызвать TerminateJobObject
когда захотите.
Пояснение: это не то, что делает диспетчер задач.
Ответ 2
Предлагаю пройти маршрут объекта работы, как указано выше, он будет наиболее надежным.
Если вы не можете идти по маршруту объекта задания, вы можете использовать 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));
Ответ 3
Существует функция 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.
-Джон
Ответ 4
Вы хотите найти идентификатор процесса для процесса, который хотите убить, затем "ходить по дереву" своих детей (и их детей и т.д.), отметить их pids, а затем убить все процессы приятно и быстро.
Ответ 5
Вы также можете использовать WMI, планирование маршрута, вы можете создать класс для выполнения задач.
Se this Где я могу найти документацию WMI?
и Библиотека WMI COM
и Примеры приложений WMI С++