10

我正在寻找不同的方法来通过 Windows XP 下的进程 ID 以编程方式暂停和恢复特定进程。

进程挂起/恢复工具使用SuspendThread/ResumeThread但警告多线程程序和死锁问题。

PsSuspend看起来不错,但我想知道它是否对死锁有什么特别之处或使用其他方法?

首选语言:C++ / Python

4

6 回答 6

5

如果您“调试调试器”(例如,logger.exe用于跟踪由 进行的所有 API 调用windbg.exe),则调试器似乎使用SuspendThread()/ResumeThread()挂起正在调试的进程中的所有线程。

PsSuspend 可能使用不同的挂起进程的方式(我不确定),但仍然有可能挂起其他进程:如果您正在挂起的进程正在持有另一个进程所需的共享同步对象,您可能会阻塞其他过程没有取得任何进展。如果两个程序都写得很好,当您恢复暂停的那个时,它们应该会恢复,但并非所有程序都写得很好。如果这导致您正在执行挂起的程序挂起,那么您就有了死锁。

于 2008-09-19T14:22:14.390 回答
4

我不确定这是否有效,但使用 MS Systernals 的 ProcessExplorer,您可以暂停一个进程。

这里有人说过:https ://superuser.com/a/155263我也在那里找到了它。

于 2012-05-04T12:17:01.137 回答
3

阅读这里,你也有 psutil for python,你可以像这样使用它:

>>> import psutil
>>> pid = 7012
>>> p = psutil.Process(pid)
>>> p.suspend()
>>> p.resume()
于 2012-12-27T11:27:10.007 回答
1

我在几个软件上测试了http://www.codeproject.com/KB/threads/pausep.aspx :

它工作正常。

PsSuspend 和 Pausep 是两个有效的选项。

于 2008-11-20T07:25:21.903 回答
1

因此,在我发现UniversalPauseButton之后,谷歌搜索(“windows SIGSTOP”),将此问题作为第一个搜索结果(感谢 Ilia K。您的评论完成了它的工作),并阅读了答案,我回去检查代码.

显然,它使用未记录的 NT 内核和 Win32 API _NtSuspendProcess_NtResumeProcess并且_HungWindowFromGhostWindow.

PsSuspend,您提到并链接到的实用程序可能使用了这些 API,我无法验证这一点,没有提供源代码,只有可执行文件和 EULA,您可能可以通过反汇编二进制文件来解决这个问题,但它违反 EULA .

因此,要回答您的具体问题,请查看UniversalPauseButton的主要内容。cpp基本上你调用_NtSuspendProcess(ProcessHandle)and _NtResumeProcess(ProcessHandle)ProcessHandle作为你想要暂停或恢复的进程的句柄。

于 2020-04-22T17:29:22.830 回答
0

我认为 Windows 中没有 SuspendProcess() 函数是有充分理由的。拥有这样的功能为不稳定的系统打开了大门。除非您自己创建了该进程,否则您不得暂停该进程。如果您自己编写了该流程,您可以使用事件(参见 MSDN 中的 ::SetEvent() 等)或其他类型的消息传递来触发流程中的暂停命令。

于 2008-09-19T11:46:51.067 回答