どのようにWindows上の子プロセスのステータスおよびリソースの使用状況を知るには?
質問
私は、子プロセスを起動するプログラムを、書きたいです。子プロセスは、ウィンドウモードまたはコンソールモードのプログラムであってもよい。
私は、子プロセスの状態とリソースの使用状況を監視します。例えば私は、子プロセスがまだ実行中または終了しているかを知りたいです。それが終了した場合、私は(正常に終了したため、またはクラッシュのさ?)理由を知りたい。
と子プロセスが実行中および/またはそれが終了し、私はそのリソースの使用状況、特にCPU時間(ユーザー時間、システム)とメモリ使用量(仮想サイズおよび/またはRSSを)知ってほしいです。数字は非常に正確でない場合、それはOKです。
Unixの用語では、私はフォーク、幹部、waitpidをとGETRUSAGEからしたいと思います。そして、フォーク+のsetrusage +幹部は、子供のリソース使用量を制限することができます。しかし、私は、Windowsプラットフォーム上でこれらを行う方法がわからない。
私はWindowsのAPI名を指してください。私は残りの部分を自分で勉強することができます。
は、Windows API以外のライブラリを使用していないことを好みます。それは親のデバッガとして活躍し、子プロセスにアタッチされていないことを好みます。ちょうど好むが、まだ受け入れられない。
解決
、それはプロセスにハンドルを返します。
プロセスが終了したか、タイムアウトが経過するまでプロセスハンドル上のWaitForSingleObjectがブロックされます。ゼロのタイムアウトはすぐに戻り、プロセスがまだ実行されているかどうかを示します。
BOOL IsProcessRunning(HANDLE process)
{
return WaitForSingleObject(process, 0) != WAIT_OBJECT_0;
}
void WaitForProcessToExit(HANDLE process)
{
WaitForSingleObject(process, INFINITE);
}
実行中のプロセスの終了コードを取得するには、GetExitCodeProcessを使用することができます。ただし、エラーコードが何を意味するかを解釈する必要があります。 0xc0000005では、アクセス違反のために典型的であるが、すべてのクラッシュが、このエラーコードをもたらさない。
は、リソースの使用状況について、あなたはIOの情報を取得するために、GetProcessMemoryInfoは、メモリの統計情報を取得するために、GDIが情報を扱う取得するには、合計CPU時間を取得するためにGetGuiResourcesをGetProcessTimesを呼び出し、GetProcessIoCountersことができます。