Rendimiento equivalente a & # 8220; Matar árbol de procesos & # 8221; en C ++ en windows

StackOverflow https://stackoverflow.com/questions/604522

  •  03-07-2019
  •  | 
  •  

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?

¿Fue útil?

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 ++

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top