linux下进程启动时间位于/proc/[pid]/stat第22字段,单位为jiffies,需结合clock_boottime和/proc/uptime换算为精确unix时间戳;windows通过getprocesstimes()获取filetime后转换,注意100纳秒单位及常数溢出。

Linux下读取/proc/[pid]/stat里的进程启动时间
Linux内核在/proc/[pid]/stat第22个字段(空格分隔)中记录了进程的启动时间,单位是「系统启动后的时钟滴答数(jiffies)」,不是Unix时间戳。必须结合/proc/uptime和系统启动时间才能换算。
实操要点:
-
sysconf(_SC_CLK_TCK)获取jiffies频率(通常为100,但不能硬编码) - 从
/proc/uptime第一列读取系统已运行秒数(浮点) - 用
clock_gettime(CLOCK_BOOTTIME, &ts)比读/proc/uptime更准,且能拿到纳秒级精度 - 进程启动的jiffies值需用
stoll()解析,字段间用空格或制表符分隔,注意跳过括号内的comm字段(第2个字段含空格)
把jiffies转成高精度Unix时间戳的核心计算
公式是:unix_ts = boot_time_unix + (process_start_jiffies / sysconf(_SC_CLK_TCK))。关键在于boot_time_unix必须足够精确——不能用time(0) - uptime这种秒级粗略估算。
推荐做法:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 用
clock_gettime(CLOCK_BOOTTIME, &ts)获取当前boottime时间(含纳秒) - 从
/proc/uptime读出uptime_sec(建议用strtod()解析,保留小数部分) - boot_time_unix =
ts.tv_sec - (time_t)uptime_sec,再用ts.tv_nsec和uptime_sec的小数部分对齐纳秒位 - 最终Unix时间戳应封装为
std::chrono::time_point<:chrono::system_clock></:chrono::system_clock>,避免手动拼double
Windows上用GetProcessTimes()配合GetSystemTimeAsFileTime()
Windows没有直接的「进程启动Unix时间戳」API,但GetProcessTimes()返回的lpCreationTime是FILETIME(100纳秒间隔,自1601-01-01起),可转为Unix时间戳(1970-01-01起)。
转换要点:
- FILETIME到Unix时间戳需减去116444736000000000ULL(即1970与1601之间的100纳秒数)
- 结果除以10^7得秒数,余数×100得纳秒(注意:FILETIME最小单位是100ns)
- 务必检查
GetProcessTimes()返回值,失败时GetLastError()可能是ERROR_ACCESS_DENIED(尤其非管理员查系统进程) - 该时间是内核视角的创建时刻,和
main()入口实际执行有微秒级偏差,但对「启动时刻」定义已足够
跨平台封装时最容易被忽略的精度陷阱
很多人用std::chrono::system_clock::now().time_since_epoch().count()代替进程启动时间,这是错的——它返回的是调用时刻,不是进程诞生时刻。
真正要注意的细节:
- Linux下
/proc/[pid]/stat的第22字段是start_time,但它的起点是系统启动,不是纪元;少一步boot time校准就全偏了 - Windows的
FILETIME是UTC,无需考虑本地时区,但转换常数必须用ULL后缀,否则32位机上会溢出 - 没有POSIX标准API能直接拿进程启动Unix时间戳,别试图用
gettimeofday()或clock_gettime(CLOCK_REALTIME)凑 - 如果需要亚毫秒级精度,Linux建议用
CLOCK_BOOTTIME而非CLOCK_MONOTONIC,后者在系统休眠时不递增
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










