2011-07-06 14 views
7

Estoy trabajando en una función que me proporciona el PID del proceso principal para un PID determinado. El prototipo de la función es¿Cómo puedo verificar de forma fiable si un proceso de Windows es el padre de otro en C++?

DWORD getParentPid(DWORD pid); 

para hacerlo, estoy usando la función CreateToolhelp32Snapshot (y las funciones relacionadas) para obtener la estructura PROCESSENTRY32 para mi dado PID pid. Luego puedo usar el campo th32ParentProcessId de la estructura para obtener el PID del proceso que creó mi proceso.

Sin embargo, dado que el proceso principal podría haberse destruido ya (y Windows podría haber reutilizado PID), estoy usando la función GetProcessTimes para obtener los tiempos de creación del supuesto padre y el proceso secundario y luego comparar aquellos usando CompareFileTime.

Si CompareFileTime devuelve , sé que el proceso con la ID principal se creó antes del proceso secundario, por lo que es el padre. De lo contrario, aparentemente es una ID reutilizada, y el PID principal no es válido (ya no hace referencia al padre original).

El problema con esto es que se basa mucho en un reloj del sistema estrictamente monótono y la granularidad de GetProcessTimes. Experimenté casos en los que CompareFileTime devolvió 0 (lo que significa "tiempo igual") aunque el proceso que se estaba considerando estaba en realidad en una relación padre-hijo. Podría cambiar mi cheque para que se considere que un CompareFileTime valor de resultado <= 0 indica un padre, pero luego rompería el caso (teórico) donde un padre creó un proceso hijo, luego el padre fue destruido y luego Windows reutilizado el PID, todo dentro de los 100ns (que es la resolución de GetProcessTimes).

Me pregunto: ¿existe un mecanismo diferente, más confiable, para verificar que algún proceso es de hecho el padre de otro proceso en C++?

Editar: Necesito esta función para determinar todos los procesos secundarios (esto significa que incluye los procesos secundarios). El CreateToolhelp32Snapshot me permite iterar sobre todos los procesos pero necesito mirar el PID padre de cada uno de ellos para decir si es un elemento secundario de mi proceso actual.

+0

No realmente. ¿Pero por qué necesitas esto? Si ni siquiera sabe si el proceso primario aún se está ejecutando, ¿qué haría con él, incluso si pudiera identificarse de manera confiable? Suena como una solución en busca de un problema. – jalf

+0

@jalf: edité mi pregunta para dar un poco más de contexto. –

+0

eso no es contexto. Usted solo está explicando el próximo paso de lo que sea que esté tratando de hacer.Entonces, si le pregunto "¿por qué necesita determinar todos los procesos secundarios" ...? ;) Si ni siquiera sabe si el proceso principal todavía se está ejecutando, es difícil ver qué podrían lograr los padres/hijos determinantes. – jalf

Respuesta

0

La muestra aquí:

http://msdn.microsoft.com/en-us/library/ms686701(v=vs.85).aspx

Shows de llamada CreateToolhelp32Snapshot con un parámetro de 0 para el processId y utiliza el TH32CS_SNAPPROCESS opción que dice que captura todos los procesos. Luego, una vez que tienes la instantánea, como en la muestra, puedes recorrer los procesos tal como existían en la instantánea. El ID padre debe ser válido dentro de la instantánea porque está viendo el estado de todos los procesos tal como existían en el único momento en que se tomó la instantánea. No tiene que molestarse con su proceso de comparación de tiempo de inicio.

+1

No hay garantía de que existiera el proceso primario en el momento en que se tomó la instantánea. Pudo haber terminado una hora antes. – jalf

+0

Este fue mi primer intento, antes de mejorar la detección usando 'GetProcessTimes' como está escrito en mi pregunta. Lo que Jalf escribe es exactamente el problema que trato de resolver. –

+1

Ok. Una discusión interesante si no la ha visto: http://www.sapphiresteel.com/Blog/Killing-Trees-the-Windows-way –

1

Si el (los) proceso (s) se han creado mientras su aplicación se está ejecutando, puede simplemente iterar sobre ella repetidamente a lo largo del tiempo y capturar la reutilización de PID.

Cuestiones relacionadas