Wykonywanie odpowiednika „Kill Process Tree” w C ++ w systemie Windows


Mamy zadanie w C ++, które rozwidli nowy proces. Ten proces z kolei może mieć wiele procesów potomnych. Jeśli zadanie zakończy się w wyznaczonym czasie, chcemy zakończyć ten rozwidlony proces.
Nie chcemy jednak pozbawiać sieroctwa procesów, które ono zrodziło. Chcemy, żeby wszyscy zginęli. Użyłem Process Explorer i ma on opcję „Kill Process Tree” podobną do „End Process Tree” Menedżera zadań systemu Windows, więc zakładam/zakładam, że istnieje do tego publiczny interfejs API. Czy ktoś to zrobił lub zna link do publicznego interfejsu API, który to robi?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Warto rozważyć „Jobs API”.
CreateJobObject
https://msdn.microsoft.com/en- ... .aspx
i przyjaciele. Możesz zmusić procesy potomne do pozostania w zadaniu, ustawiając odpowiedni atrybut. Następnie możesz zadzwonić do
TerminateJobObject
, kiedy tylko chcesz.
Wyjaśnienie: NIE to robi Menedżer zadań.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Proponuję podążać za wskazanym obiektem trasą wskazaną powyżej, będzie ona najbardziej niezawodna.
Jeśli nie możesz przejść trasy obiektu zadania, możesz użyć funkcji API toolhelp, aby uzyskać identyfikator procesu nadrzędnego i zbudować w ten sposób drzewo. Należy jednak zachować ostrożność, ponieważ system Windows nie ma silnej relacji nadrzędny/podrzędny, a identyfikatory PID można odzyskać. Możesz użyć
GetProcessTimes
, aby zapytać o czas utworzenia procesu i sprawdzić, czy jest starszy od elementu podrzędnego. Jeśli proces pośredni w drzewie zostanie zakończony, nie będzie można zejść dalej w dół drzewa.
// 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));
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Istnieje funkcja Win32 o nazwie

TerminateProcess()
http://msdn.microsoft.com/en-us/library/ms686714(VS.85).aspx... To powinno załatwić sprawę za Ciebie.
Zauważyłem również, że polecenie taskkill jest przydatne do takich rzeczy.

z wiersza poleceń

:
taskkill/F/T/IM program.exe


z kodu

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


inne przełączniki (prosto z 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.
- Jan
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Chcesz znaleźć identyfikator procesu dla procesu, który chcesz zabić, a następnie „przejść się po drzewie” jego dzieci (i ich dzieci itd.), Zauważyć ich PID, a następnie ładnie i szybko zabić wszystkie procesy.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz także skorzystać z WMI, planowania trasy możesz stworzyć klasę do wykonywania zadań.

Se this

"Where can I find the WMI documentation?"

https://coderoad.ru/483501/
and

the WMI COM library

http://www.vsj.co.uk/articles/display.asp?id=439
and

Przykładowe aplikacje WMI C ++
http://msdn.microsoft.com/en-us/library/aa394558(VS.85).aspx

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się