最直接获取进程PID的方法是使用pidof命令,如pidof chrome返回空格分隔的PID列表;C++中推荐用popen捕获输出,注意过滤用户输入以防命令注入;无pidof时可遍历/proc/[pid]/comm;Windows下用CreateToolhelp32Snapshot枚举。

Linux下用 pidof 快速获取进程PID
最直接的办法是命令行调用 pidof,它专为“名称→PID”设计,无需解析 /proc。比如查 chrome 的所有 PID:
pidof chrome返回空格分隔的数字列表(如
1234 5678)。注意它默认只匹配可执行文件名(不是完整路径),且不区分大小写。如果进程名含空格或特殊字符(如 my app),pidof 会失败——这时得换方法。
在C++中调用 system() 或 popen() 执行 pidof
从C++里调用比手写遍历 /proc 稳定得多。用 popen() 更可控,能捕获输出:
FILE* fp = popen("pidof nginx", "r");<br>if (fp) {<br> char buf[256];<br> while (fgets(buf, sizeof(buf), fp)) {<br> // 解析空格分隔的数字<br> }<br> pclose(fp);<br>}别用 system(),它不返回结果。注意:如果目标进程名是用户输入的,必须过滤掉 shell 元字符(如 ;、$()),否则有命令注入风险;建议白名单校验或改用 fork+exec 直接调用 pidof 二进制。
手动遍历 /proc 目录解析 /proc/[pid]/comm
当系统没装 pidof(如最小化容器),就得自己扫 /proc。关键点:优先读 /proc/[pid]/comm(内核提供的短进程名,无路径、无参数,且权限宽松);别依赖 /proc/[pid]/cmdline,它含完整命令行,要处理
当系统没装 pidof(如最小化容器),就得自己扫 /proc。关键点:优先读 /proc/[pid]/comm(内核提供的短进程名,无路径、无参数,且权限宽松);别依赖 /proc/[pid]/cmdline,它含完整命令行,要处理 \0 分隔、空格转义,还可能被进程主动修改。步骤:
- 用
opendir("/proc")遍历所有数字子目录 - 对每个
[pid],打开/proc/[pid]/comm - 读取第一行(不含换行符),
strcmp()匹配目标名 - 跳过权限不足的目录(
errno == EACCES)
/proc 是动态视图,遍历时 PID 可能已退出,需容忍 ENOENT 错误。Windows下用 CreateToolhelp32Snapshot 枚举进程
Windows没有 pidof 等价物,必须用 Win32 API。核心是 CreateToolhelp32Snapshot + Process32First/Next,它们读取内核快照,比 WMI 轻量、比 EnumProcesses 更易获取进程名。关键细节:
- 快照句柄必须用
TH32CS_SNAPPROCESS标志创建 -
PROCESSENTRY32结构体的szExeFile字段存的是映像名(如notepad.exe),不是完整路径,正好匹配“进程名称”语义 - 比较前需转小写或用
_stricmp(),因为 Windows 进程名大小写不敏感 - 记得调用
CloseHandle(),否则快照句柄泄漏
GetModuleFileNameEx 反查路径再截取文件名——多数进程无权访问其他进程的模块信息,会失败。立即学习“C++免费学习笔记(深入)”;
跨平台方案不存在真正“一致”的行为:Linux 的 comm 是内核态短名,Windows 的 szExeFile 是加载的映像名,两者都可能和用户启动时敲的命令不同(比如软链接、shell wrapper)。真要高可靠性,得接受“名称匹配只是启发式手段”,必要时结合命令行参数或父进程关系二次确认。


















