2011-12-24 3 views
2

Мне нужно поймать сигналы завершения процесса для дочерних процессов.C: Прекращение процесса улова для других системных процессов

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

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

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

+0

Как вы нерестом, и вы покадрово. То есть, если блокнот поднят, вы все еще можете делать что-то в консольном приложении. –

+2

Вы попробовали 'WaitForSingleObject'? – cnicutar

+0

WaitForSingleObject будет блокироваться. верный? –

ответ

3

Вы пробовали 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

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

См Waiting for a Process to Terminate

+0

+1 для предложения механизма, который дает возможность генерировать асинхронное уведомление без ядра процессора. –

Смежные вопросы