Как узнать статус дочернего процесса и использование ресурсов в Windows? - PullRequest
4 голосов
/ 15 мая 2009

Я хочу написать программу, которая запустит дочерний процесс. Дочерний процесс может быть в режиме Windows или в режиме консоли.

Я хочу отслеживать состояние дочернего процесса и использование ресурсов. например Я хочу знать, что дочерний процесс все еще выполняется или завершен. Если это прервано, я хочу знать причину (прервано нормально или из-за сбоя?).

И во время выполнения дочернего процесса и / или его завершения я хочу знать, как используются его ресурсы, особенно время процессора (время пользователя, система) и использование памяти (виртуальный размер и / или rss). Это нормально, если цифры не очень точные.

В терминологии Unix я хочу форк, exec, waitpid и getrusage. А fork + setrusage + exec может ограничить использование ресурсов дочерними элементами. Но я не знаю, как это сделать на платформе Windows.

Пожалуйста, укажите мне имя Windows API. Я мог бы изучить остальное сам.

Предпочитают не использовать библиотеку, отличную от Windows API. Предпочитают, чтобы родитель не работал как отладчик и не привязывался к дочернему процессу. Просто не предпочитаю, но все же приемлемо.

1 Ответ

8 голосов
/ 15 мая 2009

Когда вы вызываете CreateProcess, он возвращает дескриптор процесса.

WaitForSingleObject для дескриптора процесса будет блокироваться до тех пор, пока процесс не завершится или не истечет время ожидания. Тайм-аут, равный нулю, немедленно вернется и укажет, запущен ли еще процесс.

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

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

Чтобы получить код завершения работающего процесса, вы можете использовать GetExitCodeProcess. Однако вам нужно будет интерпретировать, что означает код ошибки. 0xC0000005 характерно для нарушения прав доступа, но не все сбои приводят к этому коду ошибки.

Для использования ресурсов вы можете вызывать GetProcessTimes для получения общего времени ЦП, GetGuiResources для получения информации о дескрипторе GDI, GetProcessMemoryInfo для получения статистики памяти и GetProcessIoCounters для получения информации о IO.

...