2008-09-19 11 views
8

Estoy buscando diferentes formas de detener y reanudar programáticamente un proceso en particular a través de su ID de proceso en Windows XP.¿Cómo pausar/reanudar cualquier proceso externo en Windows?

Process suspend/resume tool lo hace con SuspendThread/ResumeThread pero advierte sobre programas de subprocesos múltiples y problemas de interbloqueo.

PsSuspend se ve bien, pero me pregunto si hace algo especial acerca de los interbloqueos o utiliza otro método?

idiomas preferente: C++/Python

+2

Un comentario SEO sigue: PsSuspend se parece a un equivalente de ventanas de Linux/Unix de 'kill -SIGSTOP' o' kill -SIGCONT' (e incluso 'killall'). –

Respuesta

0

Creo que hay una buena razón por la cual no hay ninguna función SuspendProcess() en Windows. Tener esa función abre la puerta a un sistema inestable. No deberá suspender un proceso a menos que haya creado ese proceso usted mismo. Si escribió el proceso usted mismo, podría usar un evento (vea :: SetEvent() etc. en MSDN) u otro tipo de mensaje para activar un comando de pausa en el proceso.

5

Si "depuración del depurador" (por ejemplo, usando logger.exe de rastrear todas las llamadas API realizadas por windbg.exe), parece que el depurador utiliza SuspendThread()/ResumeThread() a suspender todos los subprocesos del proceso que se está depurando.

PsSuspend puede utilizar una forma diferente de suspender procesos (no estoy seguro), pero aún es posible bloquear otros procesos: si el proceso que está suspendiendo contiene un objeto de sincronización compartida que es necesario para otro proceso , puedes bloquear ese otro proceso para que no progrese. Si ambos programas están bien escritos, deberían recuperarse cuando reanude el que suspendió, pero no todos los programas están bien escritos. Y si esto hace que su programa que está suspendiendo cuelgue, entonces tiene un punto muerto.

2

No estoy seguro de si esto hace el trabajo, pero con ProcessExplorer de MS Systernals puede suspender un proceso.

Se ha dicho aquí: https://superuser.com/a/155263 y lo encontré allí también.

2

leer here y también tiene psutil para Python que se puede utilizar de esa manera:

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