определить, мертв процесс или нет - по PID - PullRequest
2 голосов
/ 01 декабря 2009

У меня есть два разных способа проверить, запущен ли процесс и работает ли он:

1) с использованием GetExitCodeProcess () 2) обход списка процессов с использованием CreateToolhelp32Snapshot () и проверка PID

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

Есть ли способ достоверно узнать, является ли процесс еще живым или мертвым, передавая PID? спасибо!

Ответы [ 4 ]

3 голосов
/ 01 декабря 2009

Вызов GetExitCodeProcess должен вернуть STILL_ACTIVE для активных процессов. После вызова TerminateProcess процесс будет остановлен, и будет возвращено другое значение.

Другой способ проверить, жив ли процесс, - WaitForSingleObject. Если вы вызовете это для дескриптора процесса с таймаутом 0, он немедленно вернет WAIT_TIMEOUT, если процесс все еще выполняется.

3 голосов
/ 01 декабря 2009

Не используйте PID для чего-то подобного. PID используются повторно и имеют узкий диапазон очень с высокой вероятностью столкновения очень . Другими словами, вы найдете работающий процесс, но это будет другой процесс.

0 голосов
/ 01 декабря 2009

Не могли бы вы использовать API статуса процесса ? Существуют функции для перечисления всех запущенных процессов в системе - это может вам помочь.

0 голосов
/ 01 декабря 2009

Вы не можете предполагать, что функции вызова API низкого уровня выглядят так, как они выглядят или как вы думаете, они должны функционировать из своего имени или описания высокого уровня. Ядру все еще есть чем заняться, и часто вызовы - это просто запросы к ядру, и ядру нужно сделать множество вещей (в зависимости от реализации), прежде чем оно действительно выпустит PID. В этом случае после того, как вы выполните вызов, вы можете предположить, что процесс мертв, но ядро ​​все еще нужно очистить.

От MSDN:

Используется функция TerminateProcess безоговорочно вызвать процесс выход. Состояние глобальных данных поддерживается динамически подключаемыми библиотеками (DLL) могут быть скомпрометированы, если TerminateProcess используется, а не ExitProcess.

TerminateProcess инициирует завершение и возвращается немедленно. Это останавливается выполнение всех потоков внутри процесс и просит отмены все ожидающие ввода / вывода. Прекращено процесс не может завершиться, пока все не будет Ввод / вывод был завершен или отменен.

Процесс не может предотвратить себя прекращается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...