How to pause / resume any external process under Windows?

帅比萌擦擦* 提交于 2019-12-18 04:09:51

问题


I am looking for different ways to pause and resume programmatically a particular process via its process ID under Windows XP.

Process suspend/resume tool does it with SuspendThread / ResumeThread but warns about multi-threaded programs and deadlock problems.

PsSuspend looks okay, but I wonder if it does anything special about deadlocks or uses another method?

Prefered languages : C++ / Python


回答1:


If you "debug the debugger" (for instance, using logger.exe to trace all API calls made by windbg.exe), it appears that the debugger uses SuspendThread()/ResumeThread() to suspend all of the threads in the process being debugged.

PsSuspend may use a different way of suspending processes (I'm not sure), but it is still possible to hang other processes: if the process you're suspending is holding a shared synchronization object that is needed by another process, you may block that other process from making any progress. If both programs are well-written, they should recover when you resume the one that you suspended, but not all programs are well-written. And if this causes your program that is doing the suspending to hang, then you have a deadlock.




回答2:


I'm not sure if this does the job, but with ProcessExplorer from MS Systernals you can suspend a process.

It's been said here: https://superuser.com/a/155263 and I found it there too.




回答3:


read here and you also have psutil for python that you can use it like that:

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



回答4:


I tested http://www.codeproject.com/KB/threads/pausep.aspx on few softwares:

it works fine.

PsSuspend and Pausep are two valid options.




回答5:


I think there is a good reason why there is no SuspendProcess() function in Windows. Having such a function opens the door for an unstable system. You shall not suspend a process unless you created that process yourself. If you wrote that process yourself, you could use an event (see ::SetEvent() etc. in MSDN) or another kind of messaging to trigger a pause command in the process.



来源:https://stackoverflow.com/questions/100480/how-to-pause-resume-any-external-process-under-windows

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!