4

子プロセスを起動するプログラムを書きたいです。子プロセスは、Windows モードまたはコンソール モードのプログラムである可能性があります。

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

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

Unix 用語では、fork、exec、waitpid、および getrusage を使用します。また、fork+setrusage+exec は、子のリソース使用を制限できます。しかし、Windows プラットフォームでこれらを行う方法がわかりません。

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

Windows API 以外のライブラリを使用しないことをお勧めします。デバッガーとして動作し、子プロセスにアタッチする親ではありません。好みではありませんが、それでも受け入れられます。

4

1 に答える 1

8

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

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

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 情報を取得できます。

于 2009-05-15T18:53:51.317 に答える