2008-09-19 3 views
8

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

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

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

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

+2

SEO комментарий следующим образом: PsSuspend выглядит как окна эквивалент Linux/UNIX в `убить -SIGSTOP` или` убить -SIGCONT` (и даже `killall`). – 2010-10-21 21:30:28

ответ

0

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

5

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

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

1

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

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

PsSuspend и Pausep - два допустимых варианта.

+0

Если вы стараетесь использовать его, он работает нормально. Если вы используете его для создания тупика, вы создаете тупик. – 2008-11-20 08:00:27

2

Я не уверен, справляется ли это с этой задачей, но с помощью ProcessExplorer из MS Systernals вы можете приостановить процесс.

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

2

чтения here и вы также psutil для питона, которые вы можете использовать его так:

>>> import psutil 
>>> pid = 7012 
>>> p = psutil.Process(pid) 
>>> p.suspend() 
>>> p.resume()