C: завершение процесса Catch для других системных процессов - PullRequest
2 голосов
/ 24 декабря 2011

Мне нужно перехватить сигналы завершения процесса для дочерних процессов.

Так, например, если мое консольное приложение Win32 запускает процесс блокнота, а пользователь закрывает блокнот, я бы хотел это обнаружить.

Я не хочу блокировать (асинхронная модель)

Я создаю процесс, используя win api CreateProcess

Ответы [ 2 ]

3 голосов
/ 24 декабря 2011

Вы пробовали WaitForSingleObject() с параметром dwMilliseconds равным 0? WaitForSingleObject() немедленно вернется, если dwMilliseconds равно 0, и вернет WAIT_TIMEOUT, если процесс не завершен, или WAIT_OBJECT_0, если это так. Пример, предполагая, что дескриптор дочернего процесса равен hProcess:

DWORD result = WaitForSingleObject(hProcess, 0);
if (result == WAIT_TIMEOUT)
    /* Process not dead */;
else if (result == WAIT_OBJECT_0)
    /* Process dead */;
else
    /* Error occured */;

И альтернатива GetExitCodeProcess(). Возвращенный им «код выхода» будет STILL_ACTIVE, если он все еще работает, в противном случае он вернет фактический код выхода. Пример, снова предполагая, что дескриптор дочернего процесса равен hProcess:

DWORD exitCode;
if (!GetExitCodeProcess(hProcess, &exitCode))
    /* Error occured */;
else if (exitCode == STILL_ACTIVE)
    /* Process is still running */
else
    /* exitCode now contains the process exit code, and the process is not running anymore */;

Оба эти примера неблокирующие

2 голосов
/ 24 декабря 2011

Использовать WaitForSingleObject из нового потока.

См. Ожидание завершения процесса

...