应读取/proc/uptime获取系统开机秒数,其首字段为自启动以来的总秒数(含小数),比time()返回的unix纪元时间更准确,也比sysinfo()更稳定、跨架构安全。

用 time() 获取自 Unix 纪元以来的秒数,不是系统启动时间
很多人第一反应是调 time(),但它返回的是从 1970-01-01 00:00:00 UTC 开始的秒数,和系统启动无关。Linux 没有直接暴露“开机秒数”的标准 C++ 接口,得绕道系统信息。
读取 /proc/uptime 是最简单可靠的方式
Linux 内核通过 /proc/uptime 文件提供两个浮点数:第一个是系统自启动以来的总秒数(含小数),第二个是空闲时间。C++ 只需打开并解析第一项即可。
实操建议:
- 用
std::ifstream打开/proc/uptime,比system()或popen()更轻量、更安全 - 读取后用
std::stod()转换,再转成整型(如static_cast<uint64_t></uint64_t>)——注意它可能超int范围,尤其运行多日的服务器 - 失败时返回 -1 或抛异常,别静默忽略;
/proc在容器中可能不可见或被挂载为只读
uint64_t get_uptime_seconds() {
std::ifstream f("/proc/uptime");
double up;
if (f >> up) {
return static_cast<uint64_t>(up);
}
return 0; // 或 throw std::runtime_error("cannot read /proc/uptime");
}</uint64_t>
用 sysinfo() 替代?小心精度和移植性问题
sysinfo() 的 uptime 字段也表示开机秒数,但它是 long 类型,在某些架构(如 32 位系统)上会在约 68 年后溢出;而且它不保证高精度(内核可能只每秒更新一次)。
相比 /proc/uptime,它的劣势明显:
-
/proc/uptime是文本接口,稳定、无 ABI 依赖、可直接cat验证 -
sysinfo()需要#include <sys></sys>,且在 musl libc(如 Alpine)中行为不一致 - 返回值单位是秒,但实际精度取决于内核配置,不一定比
/proc/uptime更准
注意容器环境下的行为差异
在 Docker 或 systemd-nspawn 容器中,/proc/uptime 默认反映的是宿主机启动时间,不是容器启动时间。如果需要容器真实运行时长,得靠外部传入(如启动时写入 /tmp/start_time)或使用 cgroup v2 的 cpu.stat 中的 usage_usec(需 root + cgroup2 启用)。
所以判断场景很关键:
- 监控宿主机健康?用
/proc/uptime没问题 - 做容器内服务超时控制?不能依赖它,得换时间戳方案
- 跨平台兼容?C++ 标准库无解,Linux-only 就老实用
/proc/uptime
真正容易被忽略的是:这个值是单调递增的,但会受 NTP 调整影响(虽然现代内核通常用 adjtimex 做平滑调整,不会跳变)。如果要做高精度计时,别拿它当 wall-clock;只用于粗略 uptime 判断就足够了。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











