Rendimiento equivalente a & # 8220; Matar árbol de procesos & # 8221; en C ++ en windows
Pregunta
Tenemos una tarea de C ++ que creará un nuevo proceso. Ese proceso a su vez puede tener varios procesos secundarios. Si la tarea se ejecuta más allá de un tiempo asignado, desearemos eliminar ese proceso bifurcado.
Sin embargo, no queremos dejar huérfanos los procesos que ha generado. Queremos que todos mueran. He utilizado Process Explorer y tiene un " Matriz de procesos de Kill " Esta opción es similar a la de " End Process Tree " del Administrador de tareas de Windows, por lo que supongo / supongo que hay una API pública para hacer esto. ¿Alguien ha hecho esto, o sabe de una referencia a una API pública que lo haga?
Solución
Es posible que desee considerar la " API de trabajos " ;. CreateJobObject
y amigos. Puede hacer que los procesos secundarios permanezcan dentro del trabajo, estableciendo el atributo apropiado. Luego puedes llamar a TerminateJobObject
cuando quieras.
Aclaración: esto NO es lo que hace el Administrador de tareas
Otros consejos
Sugiero seguir la ruta del objeto de trabajo, como se indicó anteriormente, será la más confiable.
Si no puede seguir la ruta del objeto de trabajo, puede usar la API de ayuda para herramientas para obtener las ID del proceso principal y construir el árbol de esa manera. Sin embargo, tenga cuidado, ya que Windows no tiene una relación sólida entre padres e hijos y es posible que los PID sean reciclados. Puede usar GetProcessTimes
para consultar la hora de creación del proceso y verificar que sea anterior al niño. Si se termina un proceso intermedio en el árbol, no podrá seguir caminando por el árbol.
// 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));
Hay una función Win32 llamada TerminateProcess () . Debería hacer el trabajo por ti.
Alternativamente, he encontrado que el comando taskkill es útil para cosas como esta.
desde la línea de comando:
taskkill /F /T /IM program.exe
desde el código:
system("taskkill /F /T /IM program.exe");
otros interruptores (directamente desde 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
Desea encontrar el ID de proceso para el proceso que desea matar, luego " caminar por el árbol " de sus hijos (y sus hijos, y así sucesivamente ...), tome nota de sus pids y luego elimine todos los procesos de forma agradable y rápida.
También puede usar WMI, la planificación de rutas puede crear una clase para realizar las tareas.
Haga clic en " ¿Dónde puedo encontrar la documentación de WMI? & Quot;
y la biblioteca COM de WMI
y Ejemplos de aplicación WMI C ++