我正在寻找通过Windows XP下的进程ID以编程方式暂停和恢复特定进程的不同方法。
Process suspend/resume tool使用SuspendThread
/ ResumeThread
执行此操作,但警告多线程程序和死锁问题。
PsSuspend看起来没问题,但是我想知道它是否对死锁有什么特别之处或使用其他方法?
首选语言:C ++ / Python
答案 0 :(得分:5)
如果您“调试调试器”(例如,使用logger.exe
跟踪windbg.exe
所做的所有API调用),则调试器似乎使用SuspendThread()
/ {{1}暂停正在调试的进程中的所有线程。
PsSuspend可能使用不同的方式暂停进程(我不确定),但是仍然可以挂起其他进程:如果要暂停的进程持有另一个进程需要的共享同步对象,你可以阻止其他进程取得任何进展。如果两个程序都写得很好,那么当你恢复暂停的程序时它们应该恢复,但并非所有程序都写得很好。如果这导致正在执行挂起的程序挂起,那么就会出现死锁。
答案 1 :(得分:3)
我不确定这是否能完成这项工作,但是使用MS Sysinternals的Process Explorer,您可以暂停流程。
这里有人说过:https://superuser.com/a/155263我也在那里找到了它。
答案 2 :(得分:2)
阅读here你也有pyu的psutil你可以这样使用它:
>>> import psutil
>>> pid = 7012
>>> p = psutil.Process(pid)
>>> p.suspend()
>>> p.resume()
答案 3 :(得分:1)
答案 4 :(得分:1)
因此,在我找到关于UniversalPauseButton的信息之后,请对此进行谷歌搜索(“ windows SIGSTOP”),将这个问题作为第一个搜索结果(感谢Ilia K. your comment做好了工作),然后阅读答案,我回去签出代码。
Apparently,它使用未公开的NT内核和Win32 API _NtSuspendProcess
,_NtResumeProcess
和_HungWindowFromGhostWindow
。
PsSuspend,您提到并链接到的实用程序可能使用了这些API,我无法验证这一点,没有提供源代码,仅提供了可执行文件和EULA,您可以通过反汇编二进制文件来解决这一问题,但是反对EULA。
因此,要回答您的特定问题,请结帐UniversalPauseButton的主要内容。 cpp ,basically您致电_NtSuspendProcess(ProcessHandle)
和_NtResumeProcess(ProcessHandle)
,{ {1}}是您要暂停或继续的过程的句柄。
答案 5 :(得分:0)
我认为Windows中没有SuspendProcess()函数是有充分理由的。具有这样的功能为不稳定的系统打开了大门。除非您自己创建该流程,否则不得暂停流程。 如果您自己编写该进程,则可以使用事件(请参阅MSDN中的:: SetEvent()等)或其他类型的消息来触发进程中的暂停命令。