Как я могу надежно проверить, является ли один процесс Windows родителем другого в C ++? - PullRequest
7 голосов
/ 06 июля 2011

Я работаю над функцией, которая возвращает мне 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 каждого из них, чтобы определить, является ли он дочерним для моего процесса.

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Если процесс (ы) был создан во время работы вашего приложения, вы можете просто повторять его многократно со временем и перехватывать повторное использование PID.

0 голосов
/ 06 июля 2011

Образец здесь:

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

Показывает вызов CreateToolhelp32Snapshot с параметром 0 для processId, и он использует опцию TH32CS_SNAPPROCESS, которая говорит, что захватывает все процессы. Затем, как только вы получите снимок, как в примере, вы можете пройти процессы, которые существовали в снимке. Родительские идентификаторы должны быть действительными в снимке, потому что вы смотрите на состояние всех процессов, как они существовали в тот момент, когда был сделан снимок. Вам не нужно беспокоиться о сравнении времени начала процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...