Я работаю над функцией, которая возвращает мне PID родительского процесса для данного PID.Прототип функции -
DWORD getParentPid( DWORD pid );
. Для этого я использую функцию CreateToolhelp32Snapshot
(и связанные с ней функции), чтобы получить PROCESSENTRY32
* 1009.* структура для моего заданного PID pid
.Затем я могу использовать поле th32ParentProcessId
структуры, чтобы получить PID процесса, который создал мой данный процесс.
Однако, поскольку родительский процесс уже может быть уничтожен (и его PID мог быть повторно использованWindows), я использую функцию GetProcessTimes
, чтобы получить время создания предполагаемого родителя и дочернего процесса, а затем сравнить те, которые используют CompareFileTime
.
Если CompareFileTime
возвращает -1
, я знаю, что процесс с родительским идентификатором был создан до моего дочернего процесса, так что это действительно родитель.В противном случае это, по-видимому, повторно используемый идентификатор - и родительский PID недействителен (он больше не ссылается на исходный родительский).
Проблема заключается в том, что он очень сильно зависит от строго монотонных системных часов.и гранулярность GetProcessTimes
.У меня были случаи, когда CompareFileTime
возвращал 0
(что означает «равное время»), хотя рассматриваемый процесс действительно был в отношениях родитель-ребенок.Я мог бы изменить свою проверку таким образом, чтобы считалось, что CompareFileTime
значение результата <= 0
указывает на родителя, но затем я бы нарушил (теоретический) случай, когда родительский элемент создал дочерний процесс, затем родительский элемент был уничтожен, а затемWindows повторно использовала PID - все в пределах 100 нс (что является разрешением GetProcessTimes
).
Интересно - существует ли другой, более надежный механизм проверки того, что один процесс действительно является родительским для другого?процесс в C ++?
Редактировать: Мне нужна эта функция для определения всех дочерних процессов (это означает, в том числе процессы потомков).CreateToolhelp32Snapshot
позволяет мне выполнять итерации по всем процессам, но мне нужно посмотреть на родительский PID каждого из них, чтобы определить, является ли он дочерним для моего процесса.