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

在C++中如何通过可执行文件名获取同名进程的HANDLES或PIDs?

通过可执行文件名获取PID/进程句柄的方法

当然可以通过可执行文件名获取进程的PID,甚至进一步拿到进程句柄,不同操作系统的实现方式略有不同,以下是具体方案:

Windows 平台

命令行获取PID

  • 使用tasklist筛选同名进程:
    tasklist /fi "IMAGENAME eq 你的程序名.exe"
    
    输出结果会包含目标进程的PID、内存占用等详细信息。
  • 用PowerShell精准提取PID列表:
    Get-Process -Name "程序名(无需带.exe后缀)" | Select-Object Id
    

获取进程句柄

Windows下可通过系统API遍历进程并匹配文件名,再调用OpenProcess获取句柄。用Python的pywin32库可以快速实现:

import win32api
import win32process
import win32con

def get_process_handles(name):
    handles = []
    # 创建进程快照
    snapshot = win32process.CreateToolhelp32Snapshot(win32con.TH32CS_SNAPPROCESS, 0)
    process_entry = win32process.ProcessEntry32()
    process_entry.dwSize = win32process.SizeOfProcessEntry32()

    if win32process.Process32First(snapshot, process_entry):
        while True:
            # 匹配可执行文件名
            if process_entry.szExeFile.lower() == name.lower():
                # 打开进程获取句柄
                handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, process_entry.th32ProcessID)
                handles.append((process_entry.th32ProcessID, handle))
            # 遍历下一个进程
            if not win32process.Process32Next(snapshot, process_entry):
                break
    win32api.CloseHandle(snapshot)
    return handles

Linux/macOS 平台

命令行获取PID

  • 用ps命令筛选:
    ps aux | grep "你的程序名" | grep -v grep
    
  • 更简洁的pgrep直接提取PID:
    pgrep "你的程序名"
    

获取进程句柄

类Unix系统中,进程句柄对应/proc目录下的进程子目录(如/proc/[PID]),通过PID即可访问进程的各类资源。用跨平台的psutil库可以轻松实现代码层面的获取:

import psutil

def get_process_info(name):
    process_list = []
    for proc in psutil.process_iter(['pid', 'name', 'exe']):
        try:
            # 匹配进程名或可执行文件路径
            if proc.name() == name or proc.exe().endswith(name):
                # proc对象可直接作为进程句柄,用于后续操作(如终止)
                process_list.append((proc.pid, proc))
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            continue
    return process_list

保留单个进程、终止其余的实操思路

拿到PID列表后,可根据需求选择保留目标进程(比如最早启动的PID最小项,或最新启动的PID最大项),然后终止其他进程:

  • Windows:taskkill /f /pid [目标PID]
  • Linux/macOS:kill -9 [目标PID]

内容的提问来源于stack exchange,提问作者Luis Moita

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:52:43