ps aux可列出Linux/macOS全部进程详情,tasklist/WMI用于Windows,C++应直连/proc或Toolhelp API而非popen调用命令。

Linux/macOS 下用 ps 命令快速获取进程列表
在终端直接运行 ps aux 就能列出当前系统所有用户的所有进程,包括 PID、CPU/内存占用、启动命令等关键字段。注意 ps 默认只显示当前终端相关的进程,加 a(all tty)和 x(no tty)才覆盖全部。
常见误区是只输 ps -e——它虽能列全进程,但默认只显示 PID 和 CMD,信息太少;ps aux 是更实用的组合。如果只需要 PID 和进程名,可用 ps -eo pid,comm,避免解析带空格的完整命令行。
Windows 下用 tasklist 或 WMI 获取进程信息
tasklist 是最轻量的选择:在 cmd 中执行 tasklist /fo csv /nh,输出为 CSV 格式,字段顺序固定("映像名称","PID","会话名","会话#","内存使用"),适合脚本解析。注意加 /nh 去掉表头,否则第一行是字符串而非数据。
若需更多字段(如父进程 PID、启动时间),得用 WMI:wmic process get Name,ProcessId,ParentProcessId,CreationDate。但 wmic 在 Windows 11 22H2 后已标记为“即将弃用”,新项目建议直接调用 Get-CimInstance Win32_Process(PowerShell)。
立即学习“C++免费学习笔记(深入)”;
C++ 跨平台枚举进程:Linux 用 /proc,Windows 用 CreateToolhelp32Snapshot
Linux 下没有标准 API,但 /proc 是可靠路径:遍历 /proc/[0-9]* 目录,对每个数字子目录读取 /proc/<pid>/stat</pid>(精简)或 /proc/<pid>/status</pid>(易读)。注意权限问题——部分进程(如其他用户的 root 进程)会返回 Permission denied,需跳过。
Windows 下必须用 Windows API:CreateToolhelp32Snapshot 配合 Process32First/Next。关键点有三个:TH32CS_SNAPPROCESS 必须作为第一个参数;PROCESSENTRY32 结构体需初始化 dwSize 字段(否则返回失败);循环中每次调用 Process32Next 前要重置 dwSize(很多示例漏了这点)。
跨平台封装时,别试图抽象出统一接口——Linux 的 /proc 是文件系统视图,Windows 是快照机制,行为差异大。更稳妥的做法是条件编译,或用第三方库如 libprocps(Linux)或 psutil 的 C++ 绑定(但会引入依赖)。
用 C++ 调用系统命令时的坑:输出截断、编码、权限
用 popen("ps aux", "r") 看似简单,但实际容易出问题:
-
popen返回的 FILE* 读取时可能因缓冲区满而阻塞或截断,尤其当进程数极多(如容器环境)时; - Windows 下
tasklist输出是 GBK 编码(中文系统),C++std::string直接读取会乱码,需用WideCharToMultiByte转换或改用_wpopen; - 某些安全策略(如 macOS Gatekeeper 或 Linux 的 seccomp)会禁止子进程执行外部命令,此时
popen返回nullptr,必须检查; -
ps或tasklist的字段分隔符不固定(如进程名含空格),用空格 split 会错切字段,应按固定列宽或正则提取。
真正需要稳定获取进程列表时,绕过 shell 命令、直连系统接口才是正解——/proc 的可靠性远高于 ps,Windows 的 Toolhelp API 也比 tasklist 更底层可控。但要注意,即使这样,不同内核版本或 Windows 版本仍可能微调字段含义,比如 /proc/[pid]/stat 的第 22 个字段在较新内核中才包含进程启动时间戳。


















