在Unix系统上,我们可以暂停执行流程,并与信号恢复它SIGSTOP
和SIGCONT
。 我怎样才能暂停在Windows中,无需编程单线程程序?
Answer 1:
你不能在命令行做它,你必须写一些代码(我假设你不只是寻找一个工具,否则超级用户可能是一个更好的地方问)。 我还假设您的应用程序所需的所有权限,做到这一点(的例子是没有任何错误检查)。
艰辛的道路
首先得到一个给定的进程的所有线程然后调用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);
}
请注意,这个功能显得太幼稚,恢复你应该跳过暂停线程的线程,很容易造成死锁因为挂起/恢复秩序。 对于单线程应用很冗长,但它的工作原理。
无证方式
从Windows XP开始还有就是NtSuspendProcess
但它没有证件 。 阅读这篇文章的代码示例(参考无证功能:新闻://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);
}
“调试器”的方式
要暂停程序通常是一个调试器做什么,做到这一点,你可以使用DebugActiveProcess
功能。 它会暂停流程执行(所有线程都在一起)。 要恢复你可以使用DebugActiveProcessStop
。
该功能可让您停止一个进程(考虑到其进程ID),语法很简单:只要传递要停止等,瞧进程的ID。 如果你要让你需要保持它的实例中运行,以保持暂停过程中的命令行应用程序(或它会被终止)。 详情请参阅MSDN上的备注部分。
void suspend(DWORD processId)
{
DebugActiveProcess(processId);
}
从命令行
正如我所说的Windows命令行还没有任何工具来做到这一点,但你可以调用从PowerShell的Windows API函数。 首先安装调用,WindowsAPI的脚本,那么你可以这样写:
Invoke-WindowsApi "kernel32" ([bool]) "DebugActiveProcess" @([int]) @(process_id_here)
当然,如果你需要它往往可以使一个alias
为。
Answer 2:
无需任何外部工具,你可以简单地做到这一点在Windows 7或8,通过打开资源监视器,并在CPU或概述选项卡上单击右键过程并选择挂起进程 。 资源监视器可以从任务管理器的性能选项卡启动。
Answer 3:
我使用Sysinternals公司(procexp.exe)(一个很老的)进程管理器。 这是一个替代/除了标准的任务管理器,你可以从那里进程暂停。
编辑:微软已经收购了Sysinternals的,网址: procExp.exe
除此之外,您可以设置进程的优先级要低,所以它不会在其他进程的方式获得,但是这不会中止进程。
Answer 4:
PsSuspend从命令行实用程序SysInternals
套件。 它暂停/恢复通过其ID的过程。
Answer 5:
那么,Process Explorer中有一个暂停选项。 你可以右键点击的过程中柱的过程,并选择暂停。 一旦你准备好恢复它再次右击,这次选择的简历。 过程资源管理器可以从这里获得:
http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
Answer 6:
#pragma comment(lib,"ntdll.lib")
EXTERN_C NTSTATUS NTAPI NtSuspendProcess(IN HANDLE ProcessHandle);
void SuspendSelf(){
NtSuspendProcess(GetCurrentProcess());
}
NTDLL包含导出功能NtSuspendProcess,手柄传递到过程中做的伎俩。