在C++中如何通过可执行文件名获取同名进程的HANDLES或PIDs?
通过可执行文件名获取PID/进程句柄的方法
当然可以通过可执行文件名获取进程的PID,甚至进一步拿到进程句柄,不同操作系统的实现方式略有不同,以下是具体方案:
Windows 平台
命令行获取PID
- 使用
tasklist筛选同名进程:
输出结果会包含目标进程的PID、内存占用等详细信息。tasklist /fi "IMAGENAME eq 你的程序名.exe" - 用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
相关产品推荐
相关产品推荐

