2009-05-15 3 views
4

자식 프로세스를 시작할 프로그램을 작성하고 싶습니다. 자식 프로세스는 윈도우 모드 또는 콘솔 모드 프로그램 일 수 있습니다.Windows에서 자식 프로세스 상태 및 리소스 사용을 확인하는 방법은 무엇입니까?

하위 프로세스 상태 및 리소스 사용을 모니터링하고 싶습니다. 예 : 나는 자식 프로세스가 여전히 실행 중이거나 종료되었다는 것을 알고 싶다. 종료 된 경우 그 이유를 알고 싶습니다 (정상적으로 종료되었거나 충돌로 인해 종료 되었습니까?).

실행중인 자식 프로세스 동안 및/또는 종료되었습니다. 리소스 사용, 특히 CPU 시간 (사용자 시간, 시스템) 및 메모리 사용량 (가상 크기 및/또는 rss)을 알고 싶습니다. 숫자가 정확하지 않은 것이 좋습니다.

유닉스 용어로는 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는 액세스 위반에 대한 일반적인 사항이지만 모든 오류가 발생하지는 않으므로이 오류 코드가 발생합니다.

자원 사용의 경우, 총 CPU 시간을 얻을 수 GetProcessTimes를 호출 할 수 있습니다, GetGuiResources는 GDI가 정보를 처리 얻기 위해, GetProcessMemoryInfo는 IO 정보를 얻기 위해 메모리 통계 및 GetProcessIoCounters를 얻을 수 있습니다.