直接读取/proc/uptime是最简单可靠的方式:linux内核将系统自启动以来的运行秒数(含小数)持续写入该文件,普通用户可读,用std::ifstream读取第一列浮点数即可,无需调用命令或第三方库。

直接读取 /proc/uptime 是最简单可靠的方式
Linux 内核会持续将系统自启动以来的运行秒数(含小数)写入 /proc/uptime,这是所有主流发行版都支持的稳定接口,无需调用系统命令或依赖第三方库。它比 sysinfo() 更轻量,也比解析 uptime 命令输出更可控。
实操建议:
- 用
std::ifstream打开/proc/uptime,读取第一列浮点数(单位:秒),第二列是空闲时间,通常忽略 - 注意文件权限:普通用户可读,无需 root
- 务必检查流状态,
/proc是虚拟文件系统,但极端情况下(如容器未挂载procfs)可能读失败
double uptime_seconds = 0.0;
std::ifstream file("/proc/uptime");
if (file >> uptime_seconds) {
// 成功,uptime_seconds 即为运行秒数
} else {
// 处理读取失败,例如返回 -1 或抛异常
}
用 sysinfo() 获取带结构体信息的 uptime
如果还需要负载、内存等系统状态,sysinfo() 是更全面的选择。它返回的 struct sysinfo 中 uptime 字段就是整秒数,精度略低于 /proc/uptime(丢失小数部分)。
实操建议:
- 需包含头文件
<sys></sys>和<unistd.h></unistd.h> -
sysinfo()可能因内核配置或容器限制失败(如CONFIG_SYSFS关闭),返回 -1 时应 fallback 到/proc/uptime - 注意
struct sysinfo的uptime是long类型,32 位系统下约 497 天后溢出,生产环境建议用unsigned long long存储转换结果
避免用 system("uptime") 解析命令输出
调用 shell 命令看似直观,但实际问题很多:输出格式随 locale 变化(如中文系统显示“天”而非“days”)、字段位置不固定、子进程开销大、易受 PATH 或权限干扰。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
常见错误现象:
- 在 Docker 容器中
uptime命令不存在,导致返回空或错误码 127 - 解析字符串时硬编码空格分隔,遇到多空格或 tab 就崩
- 没处理 stderr 重定向,错误信息混入 stdout 导致解析失败
除非明确要求兼容非 Linux 系统(如需同时跑 macOS),否则没必要走这条路。
精度与单位转换要注意小数部分
/proc/uptime 提供的是 seconds + fractional seconds(如 123456.78),直接转成 int 会截断。多数场景需要保留小数做平滑计算,或按需转成“天-小时-分钟-秒”格式。
实操建议:
- 用
std::floor(uptime_seconds)拆整秒,uptime_seconds - std::floor(uptime_seconds)得小数部分 - 转时分秒时,优先用整数运算避免浮点误差:先
static_cast<long long>(uptime_seconds)</long>,再除模 - 注意 C++17 起
<chrono></chrono>不提供直接读取系统 uptime 的接口,别试图用system_clock::now()减去启动时间——你根本拿不到精确的启动时刻
真正麻烦的不是读取,而是确保跨不同内核版本、容器环境和 libc 实现时行为一致;/proc/uptime 这个路径,才是你该无条件信任的那一个。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










