Как приостановить / возобновить любой внешний процесс под Windows? - PullRequest
8 голосов
/ 19 сентября 2008

Я ищу различные способы приостановить и возобновить программно определенный процесс через его идентификатор процесса в Windows XP.

Инструмент приостановки / возобновления процесса делает это с SuspendThread / ResumeThread, но предупреждает о многопоточных программах и проблемах взаимоблокировки.

PsSuspend выглядит хорошо, но мне интересно, что-нибудь особенное в блокировках или другой метод?

Предпочитаемые языки: C ++ / Python

Ответы [ 5 ]

5 голосов
/ 19 сентября 2008

Если вы «отлаживаете отладчик» (например, используете logger.exe для отслеживания всех вызовов API, сделанных windbg.exe), то кажется, что отладчик использует SuspendThread() / ResumeThread() для приостановки всех потоков в отлаживаемый процесс.

PsSuspend может использовать другой способ приостановки процессов (я не уверен), но все еще возможно повесить другие процессы: если процесс, который вы приостанавливаете, содержит общий объект синхронизации, который необходим другому процессу, Вы можете заблокировать этот другой процесс от какого-либо прогресса. Если обе программы хорошо написаны, они должны восстановиться, когда вы возобновите приостановленную, но не все программы написаны правильно. И если это приводит к зависанию вашей программы, выполняющей приостановку, то у вас тупик.

3 голосов
/ 04 мая 2012

Я не уверен, что это работает, но с ProcessExplorer от MS Systernals вы можете приостановить процесс.

Здесь было сказано: https://superuser.com/a/155263 и я тоже нашел его там.

2 голосов
/ 27 декабря 2012

read here и у вас также есть psutil для python, который вы можете использовать следующим образом:

>>> import psutil
>>> pid = 7012
>>> p = psutil.Process(pid)
>>> p.suspend()
>>> p.resume()
1 голос
/ 20 ноября 2008

Я тестировал http://www.codeproject.com/KB/threads/pausep.aspx на нескольких программах:

отлично работает.

PsSuspend и Pausep - две допустимые опции.

0 голосов
/ 19 сентября 2008

Я думаю, что есть веская причина, почему в Windows нет функции SuspendProcess (). Наличие такой функции открывает двери для нестабильной системы. Вы не должны приостанавливать процесс, если вы не создали этот процесс самостоятельно. Если вы написали этот процесс самостоятельно, вы можете использовать событие (см. :: SetEvent () и т. Д. В MSDN) или другой вид сообщений для запуска команды паузы в процессе.

...