如何在Windows中暂停/恢复进程?

在Unix中,我们可以临时暂停一个进程的执行,并用SIGSTOPSIGCONT信号恢复进程。 我如何在没有编程的情况下暂停Windows中的单线程进程?

你不能从命令行执行,你必须编写一些代码(我假设你不只是寻找一个实用程序,否则超级用户可能是一个更好的地方问)。 我也假设你的应用程序具有所有必要的权限(例子没有任何错误检查)。

艰辛的道路

首先获取给定进程的所有线程,然后调用SuspendThread函数来停止每个线程(并恢复ResumeThread )。 它可以工作,但是某些应用程序可能会崩溃或挂起,因为线程可能会在任何时候停止,并且挂起/恢复的顺序是不可预知的(例如,这可能导致死锁)。 对于单线程应用程序,这可能不是一个问题。

 void suspend(DWORD processId) { HANDLE hThreadSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); THREADENTRY32 threadEntry; threadEntry.dwSize = sizeof(THREADENTRY32); Thread32First(hThreadSnapshot, &threadEntry); do { if (threadEntry.th32OwnerProcessID == processId) { HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, threadEntry.th32ThreadID); SuspendThread(hThread); CloseHandle(hThread); } } while (Thread32Next(hThreadSnapshot, &threadEntry)); CloseHandle(hThreadSnapshot); } 

请注意,这个函数太天真了,为了恢复线程,你应该跳过被挂起的线程,并且由于暂停/恢复命令很容易导致死锁。 对于单线程的应用程序它是prolix,但它的工作。

无证的方式

从Windows XP开始,有NtSuspendProcess但是没有logging 。 阅读这篇文章的代码示例(引用无证函数:news://comp.os.ms-windows.programmer.win32)。

 typedef LONG (NTAPI *NtSuspendProcess)(IN HANDLE ProcessHandle); void suspend(DWORD processId) { HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId)); NtSuspendProcess pfnNtSuspendProcess = (NtSuspendProcess)GetProcAddress( GetModuleHandle("ntdll"), "NtSuspendProcess"); pfnNtSuspendProcess(processHandle); CloseHandle(processHandle); } 

“debugging器”的方式

暂停一个程序通常是一个debugging器,你可以使用DebugActiveProcess函数。 它会挂起stream程执行(所有线程都在一起)。 要恢复您可能会使用DebugActiveProcessStop

这个函数允许你停止一个进程(给定进程ID),语法非常简单:只要传递你想停止进程的进程ID即可。 如果你要创build一个命令行应用程序,你需要保持它的实例运行,以保持进程暂停(或终止)。 有关详细信息,请参阅MSDN上的注释部分。

 void suspend(DWORD processId) { DebugActiveProcess(processId); } 

从命令行

正如我所说的Windows命令行没有任何实用工具,但可以从PowerShell调用Windows API函数。 首先安装Invoke-WindowsApi脚本,然后你可以这样写:

 Invoke-WindowsApi "kernel32" ([bool]) "DebugActiveProcess" @([int]) @(process_id_here) 

当然,如果你经常需要它,你可以为此做一个alias

在没有任何外部工具的情况下,您可以简单地在Windows 7或8上完成此操作,方法是打开资源监视器,然后在CPU或“概览”选项卡上右键单击该进程并select挂起进程 。 资源监视器可以从任务pipe理器的性能选项卡启动。

我使用SysInternals(procexp.exe)(一个非常古老的)进程pipe理器。 它是标准任务pipe理器的替代/添加,您可以暂停该进程。

编辑:微软已经购买了SysInternals ,url: procExp.exe

除此之外,您可以将进程优先级设置为低,以避免妨碍其他进程,但这不会暂停进程。

从SysInternals套件PsSuspend命令行实用程序。 它通过它的id挂起/恢复一个进程。

那么,Process Explorer有一个暂停选项。 您可以右键单击进程列中的进程并select暂停。 一旦准备好再次恢复,请右键单击,然后select恢复。 Process Explorer可以从这里获得:

http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx