私は与えられたPIDの親プロセスのPIDを取得する関数に取り組んでいます。関数のプロトタイプは、そうするためにWindowsプロセスがC++で別のWindowsプロセスが親プロセスであるかどうかを確実に確認するにはどうすればよいですか?
DWORD getParentPid(DWORD pid);
で、私は与えられたPID pid
ためPROCESSENTRY32
構造を得るためにCreateToolhelp32Snapshot
機能(および関連機能)を使用しています。次に、構造のth32ParentProcessId
フィールドを使用して、与えられたプロセスを作成したプロセスのPIDを取得できます。
しかし、親プロセスがすでに破壊されている可能性があり(WindowsではPIDが再利用されている可能性があります)、私はGetProcessTimes
関数を使用して、想定されている親プロセスと子プロセスの作成時間を取得してから比較しますCompareFileTime
を使用するもの。
CompareFileTime
が-1
の場合、私は親プロセスのプロセスが私の子プロセスの前に作成されていることを知っています。それは確かに親です。それ以外の場合は、明らかに再使用されたIDです。親PIDは無効です(元の親をもう参照していません)。
この問題は、厳密に単調なシステムクロックと粒度がGetProcessTimes
に非常に依存していることが原因です。私は、考えられているプロセスが実際に親子関係にあったとしても、CompareFileTime
が0
(「等しい時間」を意味する)を返すケースを経験しました。私は、CompareFileTime
結果値<= 0
が親を示すと見なされるようにチェックを変更することができましたが、親が子プロセスを作成した親が破棄され、Windowsが再利用された(理論的な) PIDはすべて100ns以内(これはGetProcessTimes
の解像度)です。
私は、ある種のプロセスが確かにC++の別のプロセスの親であることを検証するための、より信頼性の高い、異なるメカニズムがあるのだろうか?
編集:すべての子プロセス(これはグランドプロセスを含む)を決定するには、この関数が必要です。 CreateToolhelp32Snapshot
では、すべてのプロセスを繰り返し処理することができますが、それぞれのプロセスの子プロセスかどうかを判断するために、それぞれの親PIDを調べる必要があります。
しかし、なぜこれが必要ですか?親プロセスがまだ実行中であるかどうかわからない場合でも、それが確実に識別できる場合でも、それをどうしたらよいでしょうか?問題を探すための解決策のように聞こえる。 – jalf
@ jalf:私はいくつかの文脈を与えるために私の質問を編集しました。 –
それは文脈ではありません。あなたは何をしようとしているのかの次のステップを説明するだけです。ですから、私はあなたに "なぜすべての子プロセスを決定する必要があるのですか"と尋ねると... ...? ;)親プロセスがまだ実行中であるかどうかわからなくても、親/子が何を達成するかを知ることは難しいです。 – jalf