4

我想编写一个程序,它将启动一个子进程。子进程可能是 windows 模式或控制台模式程序。

我想监控子进程状态和资源使用情况。例如,我想知道子进程仍在运行或终止。如果它终止了,我想知道原因(是正常终止还是因为崩溃?)。

在子进程运行和/或终止期间,我想知道它的资源使用情况,尤其是 CPU 时间(用户时间、系统)和内存使用情况(虚拟大小和/或 rss)。如果数字不是很准确也没关系。

在 Unix 术语中,我想 fork、exec、waitpid 和 getrusage。而fork+setrusage+exec可以限制child的资源使用。但我不知道如何在 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 回答