2009-05-15 10 views
4

Ich möchte ein Programm schreiben, das einen untergeordneten Prozess startet. Der Kindprozess kann ein Fenstermodus oder ein Konsolenmodusprogramm sein.Wie kann der Prozessstatus und die Ressourcennutzung von untergeordneten Fenstern in Windows erkannt werden?

Ich möchte den Status des untergeordneten Prozesses und die Ressourcennutzung überwachen. z.B. Ich möchte wissen, dass der Kindprozess noch läuft oder beendet wird. Wenn es beendet wird, möchte ich den Grund wissen (wird normalerweise beendet oder wegen des Absturzes?).

Und während der Child-Prozess ausgeführt und/oder es beendet, möchte ich wissen, seine Ressourcennutzung, insbesondere CPU-Zeit (Benutzerzeit, System) und Speichernutzung (virtuelle Größe und/oder rss). Es ist in Ordnung, wenn die Zahlen nicht sehr genau sind.

In der Unix-Terminologie möchte ich Fork, Exec, Waitpid und Getrusage. Und fork + setrusage + exec kann die Ressourcennutzung von Kindern einschränken. Aber ich weiß nicht, wie man das auf der Windows-Plattform macht.

Bitte zeigen Sie mir den Windows-API-Namen. Ich könnte den Rest selbst studieren.

Verwenden Sie keine andere Bibliothek als die Windows-API. Bevorzugen Sie es nicht als Debugger und Anfügen an Child-Prozess. Einfach nicht bevorzugen, aber immer noch akzeptabel.

Antwort

6

Wenn Sie CreateProcess aufrufen, wird ein Handle für den Prozess zurückgegeben.

WaitForSingleObject auf einem Prozesshandle wird blockiert, bis der Prozess beendet wurde oder das Zeitlimit abgelaufen ist. Ein Timeout von Null wird sofort zurückgegeben und zeigt an, ob der Prozess noch läuft.

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

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

Um den Exit-Code eines laufenden Prozesses zu erhalten, können Sie GetExitCodeProcess verwenden. Sie müssen jedoch interpretieren, was der Fehlercode bedeutet. 0xC0000005 ist typisch für eine Zugriffsverletzung, aber nicht alle Abstürze führen zu diesem Fehlercode.

Für die Ressourcennutzung können Sie GetProcessTimes abrufen, um die gesamte CPU-Zeit zu erhalten, GetGuiResources GDI-Handle-Informationen abrufen, GetProcessMemoryInfo Speicherstatistiken abrufen und GetProcessIoCounters IO-Informationen abrufen.