Linux 用 /proc/uptime 获取启动时间最可靠,因其为内核维护的权威浮点秒数;macOS 需用 sysctl 查询 kern.boottime 并计算差值;Windows 推荐 GetTickCount64(),但注意其不计休眠且单位为毫秒。

Linux 下用 /proc/uptime 获取启动时间最可靠
Linux 系统把自启动以来的秒数(含小数)直接写在 /proc/uptime 第一个字段里,这是内核维护的权威值,不依赖外部工具或系统时钟校准。读取它只需要打开文件、解析首字段即可,开销极低。
常见错误是试图用 time(0) - boot_time 反推,但 boot_time 并非标准 C++ 接口提供;也有用 sysinfo() 的,但它返回的是 uptime 秒数(struct sysinfo.uptime),精度只有秒,且部分容器环境可能被截断或虚拟化干扰。
实操建议:
- 用
std::ifstream打开/proc/uptime,读取第一个double值 - 注意检查文件是否可读,某些最小化容器(如 distroless)可能不含
/proc文件系统挂载 - 不要用
system("uptime")解析输出——依赖 shell、locale、格式易变,且 fork 开销大
macOS 用 sysctl 查 kern.boottime
macOS 没有 /proc,必须通过 sysctl 查询 kern.boottime,它返回一个 struct timeval,表示系统启动时刻的绝对时间(UTC)。当前时间减去它才是 uptime。
立即学习“C++免费学习笔记(深入)”;
容易踩的坑:
-
sysctl调用需传入CTL_KERN、KERN_BOOTTIME等宏,参数类型和长度必须严格匹配,否则返回-1且errno为ENOMEM或EINVAL - 不能直接用
time(0)减——因为kern.boottime是struct timeval,要转成秒再算差值 - 某些沙盒化环境(如 Xcode Playground 或 App Sandbox)可能禁止该
sysctl,需提前处理失败路径
示例关键逻辑:sysctl(mib, 2, &bt, &size, nullptr, 0) 成功后,uptime = time(nullptr) - bt.tv_sec。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
Windows 用 GetTickCount64() 注意溢出与精度
Windows 提供 GetTickCount64() 直接返回毫秒级 uptime,64 位值避免了旧版 GetTickCount() 的 49.7 天溢出问题,是首选接口。
但要注意:
- 它从系统启动开始计,不包括休眠时间(从 Windows 8 起默认行为);若需包含休眠,得用
QueryUnbiasedInterruptTime()+ 额外计算,复杂度陡增 - 返回单位是毫秒,不是秒——别忘了除以
1000.0转成秒级浮点数用于统一处理 - 该函数在
kernel32.dll中,需链接-lkernel32(MSVC 下通常自动),MinGW 用户容易漏加链接项导致undefined reference
跨平台封装时别硬编码路径或宏
想写一次代码跑三端?别在源码里 #ifdef __linux__ 堆逻辑。更稳妥的做法是:用 CMake 在编译期探测系统(CMAKE_SYSTEM_NAME),导出预定义宏(如 TARGET_LINUX),让业务代码只依赖抽象接口。
例如定义统一函数:
double get_system_uptime_seconds();
其内部实现按平台分文件(uptime_linux.cpp、uptime_darwin.cpp、uptime_windows.cpp),各自链接对应系统 API。这样既避免头文件污染,又方便单元测试 mock。
最容易被忽略的是 Windows 下的休眠语义差异——如果业务逻辑对“真实运行时长”敏感(比如 license 计时),仅靠 GetTickCount64() 会出偏差,这时必须查文档确认是否启用 SYSTEM_POWER_STATUS 补偿,而不是假设所有平台 uptime 定义一致。

















