最可靠方式是解析/proc/[pid]/stat第14、15字段(utime/stime),单位为jiffies,必须运行时调用sysconf(_sc_clk_tck)获取真实频率换算成秒,不可硬编码100。

Linux下用/proc/[pid]/stat读取进程时间戳
直接解析/proc/[pid]/stat是获取用户态+内核态CPU时间最轻量、最可靠的方式。该文件第14、15字段分别是utime(用户态jiffies)和stime(内核态jiffies),单位是系统时钟滴答(jiffies),需结合sysconf(_SC_CLK_TCK)换算成秒。
常见错误是硬编码CLK_TCK = 100——虽然多数x86_64系统默认为100,但ARM或容器环境可能不同;必须运行时调用sysconf获取真实值。
- 打开
/proc/[pid]/stat后需逐字段跳过空格/括号(第2字段是进程名,含空格和括号,必须按格式解析,不能简单sscanf到第14位) - 推荐用
std::ifstream配合std::string逐字符扫描,或用procps库的readproc函数避免解析出错 - 注意:该文件每行只有一条记录,但字段数固定为52(内核>=2.6),字段索引从1开始计数,
utime是第14个,stime是第15个
两次采样计算CPU利用率要避开clock_gettime(CLOCK_MONOTONIC)陷阱
CPU利用率本质是「进程占用CPU时间 / 实际流逝时间」的比值,必须做两次采样(t1→t2),但时间基准选错会导致结果漂移甚至负值。
绝对不能用gettimeofday()或std::chrono::system_clock——它们受系统时间调整影响;也不能只用CLOCK_PROCESS_CPUTIME_ID,它只反映本进程总调度时间,无法对应外部流逝时间。
- 必须用
clock_gettime(CLOCK_MONOTONIC, &ts)获取稳定单调递增的实时时钟作为分母 - 分子用
(utime2 + stime2) - (utime1 + stime1),单位统一转为微秒或毫秒再相除 - 采样间隔建议≥200ms:太短则jiffies变化可能为0(尤其低负载进程),导致除零或结果突变
Windows上用GetProcessTimes()替代/proc方案
Windows没有/proc伪文件系统,等效接口是GetProcessTimes(),返回FILETIME结构体,包含dwCreationTime、dwExitTime、dwKernelTime、dwUserTime四个字段。其中后两者即内核态与用户态时间,单位是100纳秒。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
容易忽略的是FILETIME是64位整数,但Windows API以两个DWORD传入,必须用ULARGE_INTEGER联合体或FileTimeToUInt64()安全转换,否则高位截断导致时间倒退。
-
dwExitTime在进程存活时为0,不可用于判断是否退出 - 若目标进程权限不足(如SYSTEM进程),
OpenProcess()会失败,需提前检查ERROR_ACCESS_DENIED - 同一进程多次调用
GetProcessTimes()开销极小,无需缓存,但要注意句柄泄漏——每次OpenProcess后必须CloseHandle
跨平台封装时别碰top/ps命令解析
试图通过popen("ps -o pid,pcpu ...")或解析top -b -n1输出来获取CPU利用率,看似简单,实则埋雷最多:输出格式随locale、版本、列宽动态变化,ps的%cpu本身是采样窗口内估算值(非精确积分),且无法区分用户态/内核态。
更关键的是,这类方式启动子进程带来额外调度开销,高频采集时反而扭曲被测进程的CPU行为。
- Linux坚持走
/proc/[pid]/stat+sysconf(_SC_CLK_TCK) - Windows坚持走
GetProcessTimes()+QueryPerformanceCounter()(比GetTickCount64精度更高) - 若需统一接口,可定义结构体
struct CpuTime { uint64_t user_us; uint64_t kernel_us; uint64_t wall_ms; },由平台专属实现填充,上层只处理计算逻辑
真正难的不是读时间,而是确保两次采样之间没有被信号中断、调度器抢占或系统休眠干扰——所以生产环境务必加超时重试和异常值过滤,比如单次增幅超过理论最大值(如1000%)就丢弃该样本。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










