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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top