如何在C++中实现指定PID进程的暂停与恢复功能?
C++ 实现指定PID进程暂停/恢复的方案
Windows 平台实现
Windows系统下通过操作进程内所有线程的挂起/恢复状态实现进程的暂停和恢复,步骤如下:
- 调用
OpenProcess函数获取目标PID的进程句柄,申请的权限需包含PROCESS_QUERY_INFORMATION - 调用
CreateToolhelp32Snapshot获取系统全局线程快照,遍历所有线程筛选出归属进程ID等于目标PID的线程 - 对每个匹配的线程调用
OpenThread获取线程句柄,申请THREAD_SUSPEND_RESUME权限 - 暂停进程时对每个线程调用
SuspendThread,恢复进程时对每个线程调用ResumeThread - 所有操作完成后调用
CloseHandle关闭打开的句柄,避免资源泄漏
核心代码示例:
#include <windows.h> #include <tlhelp32.h> // 暂停指定PID的进程 bool SuspendProcess(DWORD pid) { HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if (hThreadSnap == INVALID_HANDLE_VALUE) return false; THREADENTRY32 te32; te32.dwSize = sizeof(THREADENTRY32); if (!Thread32First(hThreadSnap, &te32)) { CloseHandle(hThreadSnap); return false; } do { if (te32.th32OwnerProcessID == pid) { HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te32.th32ThreadID); if (hThread) { SuspendThread(hThread); CloseHandle(hThread); } } } while (Thread32Next(hThreadSnap, &te32)); CloseHandle(hThreadSnap); return true; } // 恢复指定PID的进程,仅需将SuspendThread替换为ResumeThread即可 bool ResumeProcess(DWORD pid) { HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if (hThreadSnap == INVALID_HANDLE_VALUE) return false; THREADENTRY32 te32; te32.dwSize = sizeof(THREADENTRY32); if (!Thread32First(hThreadSnap, &te32)) { CloseHandle(hThreadSnap); return false; } do { if (te32.th32OwnerProcessID == pid) { HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te32.th32ThreadID); if (hThread) { ResumeThread(hThread); CloseHandle(hThread); } } } while (Thread32Next(hThreadSnap, &te32)); CloseHandle(hThreadSnap); return true; }
Linux 平台实现
Linux系统下通过系统信号实现进程的暂停和恢复,无需遍历线程,实现更简单:
- 给目标PID发送
SIGSTOP信号即可暂停整个进程 - 给目标PID发送
SIGCONT信号即可恢复被暂停的进程
核心代码示例:
#include <signal.h> #include <sys/types.h> // 暂停指定PID的进程 bool SuspendProcess(pid_t pid) { return kill(pid, SIGSTOP) == 0; } // 恢复指定PID的进程 bool ResumeProcess(pid_t pid) { return kill(pid, SIGCONT) == 0; }
注意事项
- Windows下如果要操作系统级进程、管理员权限启动的进程,当前程序也需要以管理员身份运行才能获取足够权限
- Linux下如果要操作其他用户启动的进程,当前程序需要持有root权限才能调用成功
内容的提问来源于stack exchange,提问作者yoyopi768 yoyopi768
相关产品推荐
相关产品推荐

