2011-07-06 24 views
7

私は与えられたPIDの親プロセスのPIDを取得する関数に取り組んでいます。関数のプロトタイプは、そうするためにWindowsプロセスがC++で別のWindowsプロセスが親プロセスであるかどうかを確実に確認するにはどうすればよいですか?

DWORD getParentPid(DWORD pid); 

で、私は与えられたPID pidためPROCESSENTRY32構造を得るためにCreateToolhelp32Snapshot機能(および関連機能)を使用しています。次に、構造のth32ParentProcessIdフィールドを使用して、与えられたプロセスを作成したプロセスのPIDを取得できます。

しかし、親プロセスがすでに破壊されている可能性があり(WindowsではPIDが再利用されている可能性があります)、私はGetProcessTimes関数を使用して、想定されている親プロセスと子プロセスの作成時間を取得してから比較しますCompareFileTimeを使用するもの。

CompareFileTime-1の場合、私は親プロセスのプロセスが私の子プロセスの前に作成されていることを知っています。それは確かに親です。それ以外の場合は、明らかに再使用されたIDです。親PIDは無効です(元の親をもう参照していません)。

この問題は、厳密に単調なシステムクロックと粒度がGetProcessTimesに非常に依存していることが原因です。私は、考えられているプロセスが実際に親子関係にあったとしても、CompareFileTime0(「等しい時間」を意味する)を返すケースを経験しました。私は、CompareFileTime結果値<= 0が親を示すと見なされるようにチェックを変更することができましたが、親が子プロセスを作成した親が破棄され、Windowsが再利用された(理論的な) PIDはすべて100ns以内(これはGetProcessTimesの解像度)です。

私は、ある種のプロセスが確かにC++の別のプロセスの親であることを検証するための、より信頼性の高い、異なるメカニズムがあるのだろうか?

編集:すべての子プロセス(これはグランドプロセスを含む)を決定するには、この関数が必要です。 CreateToolhelp32Snapshotでは、すべてのプロセスを繰り返し処理することができますが、それぞれのプロセスの子プロセスかどうかを判断するために、それぞれの親PIDを調べる必要があります。

+0

しかし、なぜこれが必要ですか?親プロセスがまだ実行中であるかどうかわからない場合でも、それが確実に識別できる場合でも、それをどうしたらよいでしょうか?問題を探すための解決策のように聞こえる。 – jalf

+0

@ jalf:私はいくつかの文脈を与えるために私の質問を編集しました。 –

+0

それは文脈ではありません。あなたは何をしようとしているのかの次のステップを説明するだけです。ですから、私はあなたに "なぜすべての子プロセスを決定する必要があるのですか"と尋ねると... ...? ;)親プロセスがまだ実行中であるかどうかわからなくても、親/子が何を達成するかを知ることは難しいです。 – jalf

答えて

0

ここにサンプル:

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

ショーPROCESSID 0のパラメータでCreateToolhelp32Snapshotを呼び出すと、それはそれはすべてのプロセスをキャプチャすると言うオプションTH32CS_SNAPPROCESSを使用しています。次に、サンプルのようにスナップショットを取得すると、スナップショットに存在していたプロセスを歩くことができます。親IDはスナップショット内で有効である必要があります。なぜなら、スナップショットが作成されたときのすべてのプロセスの状態を一瞬で見ているからです。プロセスの開始時間の比較に気を使う必要はありません。

+1

スナップショットが作成された時点で親プロセスが存在するという保証はありません。 1時間早く終了する可能性があります。 – jalf

+0

これは私の質問で書かれた 'GetProcessTimes'を使って検出を改善する前の私の最初の試みでした。 jalfが書いていることはまさに私が解決しようとしている問題です。 –

+1

あなたがそれを見ていない場合は興味深い議論です:http://www.sapphiresteel.com/Blog/Killing-Trees-the-Windows-way –

1

あなたのアプリケーションの実行中にプロセスが作成されている場合は、時間の経過と共に反復処理を繰り返し、PIDを再利用することができます。