2009-05-15 26 views
4

子プロセスを起動するプログラムを作成したいと思います。子プロセスは、ウィンドウモードまたはコンソールモードプログラムであってもよい。Windowsでの子プロセスの状態とリソースの使用方法を知るには?

子プロセスのステータスとリソースの使用状況を監視したいと考えています。例えば子プロセスがまだ実行中か終了していることを知りたい。終了した場合は、理由を知りたい(正常に終了したか、クラッシュしたのか?)。

子プロセスの実行中および/または終了中に、そのリソース使用量、特にCPU時間(ユーザー時間、システム)およびメモリ使用量(仮想サイズおよび/またはrss)を知りたい。数字があまり正確でない場合は問題ありません。

UNIXの用語では、私はfork、exec、waitpid、getrusageを使いたいと思います。また、fork + setrusage + execは、子のリソース使用を制限することができます。しかし、私はWindowsプラットフォームでこれを行う方法を知らない。

Windows API名を教えてください。私は自分で残りを勉強することができました。

Windows API以外のライブラリを使用しないことをお勧めします。それは、デバッガとして働いている親ではなく、子プロセスにアタッチしていることが望ましいです。ただ好きではないが、それでも受け入れられる。

答えて

6

CreateProcessを呼び出すと、プロセスのハンドルが返されます。

プロセスハンドル上のWaitForSingleObjectは、プロセスが終了するかタイムアウトが切れるまでブロックされます。タイムアウトが0になるとすぐに戻り、プロセスがまだ実行中かどうかを示します。

BOOL IsProcessRunning(HANDLE process) 
{ 
    return WaitForSingleObject(process, 0) != WAIT_OBJECT_0; 
} 

void WaitForProcessToExit(HANDLE process) 
{ 
    WaitForSingleObject(process, INFINITE); 
} 

実行中のプロセスの終了コードを取得するには、GetExitCodeProcessを使用します。ただし、エラーコードの意味を解釈する必要があります。 0xC0000005はアクセス違反の典型ですが、すべてのクラッシュがこのエラーコードになるわけではありません。

リソース使用のために、GetProcessTimesを呼び出して合計CPU時間を取得し、GetGuiResourcesを使用してGDIハンドル情報を取得し、GetProcessMemoryInfoを使用してメモリ統計情報を取得し、GetProcessIoCountersを使用してIO情報を取得できます。

関連する問題