如何在Windows下暂停/恢复任何外部进程?

11
我正在寻找以编程方式暂停和恢复特定进程(通过其进程ID)的不同方法,Windows XP下有哪些?Process suspend/resume tool使用SuspendThread/ResumeThread,但警告多线程程序和死锁问题。 PsSuspend看起来还不错,但我想知道它是否对死锁做了任何特殊处理或者使用了另一种方法? 首选语言:C ++ / Python。

4
一个SEO评论如下:PsSuspend看起来像是Windows版本的Linux / UNIX的 kill -SIGSTOP 或者 kill -SIGCONT(甚至是 killall)。 - Ilia K.
6个回答

5
如果您“调试调试器”(例如使用logger.exe跟踪windbg.exe所做的所有API调用),则似乎调试器使用SuspendThread()/ResumeThread()来暂停被调试进程中的所有线程。PsSuspend可能会使用不同的挂起进程方式(我不确定),但仍然有可能挂起其他进程:如果您挂起的进程持有另一个进程需要的共享同步对象,那么您可能阻止这个进程取得任何进展。如果两个程序编写良好,则应在恢复挂起的进程时恢复执行,但并非所有程序都编写良好。如果这导致执行挂起操作的程序挂起,则会发生死锁。

4

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

在此处提到过:https://superuser.com/a/155263,我也在那里找到了它。


1
哇!这就是它!非常感谢你! - Tomas

3

在这里阅读,你还可以使用Python的psutil库来实现:

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

1
所以,当我发现 UniversalPauseButton 后,谷歌搜索它(“windows SIGSTOP”),得到这个问题作为第一个搜索结果(感谢 Ilia K. 你的评论 做了它的工作),并阅读答案后,我回去检查代码。 显然,它使用未记录的 NT 内核和 Win32 API _NtSuspendProcess_NtResumeProcess_HungWindowFromGhostWindow
PsSuspend,你提到并链接的实用程序可能使用这些API,我无法验证这一点,因为没有提供源代码,只有可执行文件和 EULA,你可以通过反汇编二进制文件来弄清楚,但这违反了 EULA。

因此,为了回答您的具体问题,请查看UniversalPauseButton的main.cpp基本上您需要调用_NtSuspendProcess(ProcessHandle)_NtResumeProcess(ProcessHandle),其中ProcessHandle是您想要暂停或恢复的进程的句柄。


1

如果你在使用它时小心谨慎,那么它就能很好地运作。但如果你用它来创建死锁,那么你就会造成死锁。 - Windows programmer

0

我认为在Windows中没有SuspendProcess()函数的很好的原因。拥有这样的功能会打开一个不稳定系统的大门。除非你自己创建了该进程,否则不应该暂停进程。 如果您自己编写了该进程,则可以使用事件(请参见MSDN中的::SetEvent()等)或其他类型的消息来触发进程中的暂停命令。


1
Linux 的 Ctrl+Z 进程暂停功能非常稳定。 - ogurets

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接