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.
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
@jalf: edité mi pregunta para dar un poco más de contexto. –
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