You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:54:04