Realizando equivalente a “matança Processo Tree” em C ++ no Windows
Pergunta
Nós temos uma tarefa C ++ que irá desembolsar um novo processo. Esse processo, por sua vez pode ter vários processos filhos. Se a tarefa é executada últimos um certo tempo, vamos quero matar esse processo bifurcada.
No entanto, nós não queremos órfãos os processos que tem gerado. Queremos que todos eles morressem. Eu usei o Process Explorer e tem uma opção de "matança Processo Tree", semelhante ao "Finalizar processo Tree" de tarefas do Windows Manager, então eu estou supondo / assumindo que há uma API pública para fazer isso. Alguém já fez isso, ou sabe de uma referência a uma API pública que faz?
Solução
Você pode querer considerar o "Jobs API". CreateJobObject
e amigos. Você pode aplicar processos filhos para ficar dentro do Job, definindo atributo apropriado. Em seguida, você pode chamar TerminateJobObject
quando quiser.
Esclarecimento:. Este não é o Gerenciador de tarefas faz
Outras dicas
Eu sugiro ir a rota objeto de trabalho, como indicado acima, será o mais confiável.
Se você não pode ir a rota objeto de trabalho, você pode usar a API TOOLHELP para obter processo pai ID de e construir a árvore dessa maneira. Seja cauteloso, porém, desde que o Windows não tem uma forte relação pai / filho e é possível para PID de começar reciclado. Você pode usar GetProcessTimes
para consultar o tempo de criação do processo e verificar se é mais velho do que a criança. Se um processo intermediário na árvore é terminada, você não será capaz de andar mais a árvore.
// 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));
Há uma função Win32 chamado TerminateProcess () . Ele deve fazer o trabalho para você.
Como alternativa, eu encontrei o comando taskkill para ser útil para coisas como esta.
a partir da linha de comando:
taskkill /F /T /IM program.exe
a partir do código:
system("taskkill /F /T /IM program.exe");
outros switches (em linha reta de 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
Você quer encontrar o ID do processo para o processo que deseja matar, então "andar a árvore" de seus filhos (e seus filhos, e assim por diante ...), observe seus pids, e depois matar todos os processos agradável e rapidamente.
Você também pode usar o WMI, planejamento de rotas você pode criar uma classe para executar as tarefas.
Se este "Onde posso encontrar a documentação WMI?"
e A biblioteca WMI COM
e WMI C ++ Exemplos de Aplicação