商城首页欢迎来到中国正版软件门户

您的位置:首页 >C++如何获取系统启动时间 _ GetTickCount与uptime方法【实战】

C++如何获取系统启动时间 _ GetTickCount与uptime方法【实战】

  发布于2026-05-03 阅读(0)

扫一扫,手机访问

C++如何获取系统启动时间:GetTickCount与uptime方法实战

C++如何获取系统启动时间 _ GetTickCount与uptime方法【实战】

在跨平台开发中,获取系统启动时间是个看似简单、实则暗藏玄机的任务。Windows下的GetTickCount64和Linux下的/proc/uptime,这两者提供的“启动时间”在语义上有着本质区别,直接互换使用,往往是线上监控告警误触发的罪魁祸首。

Windows用GetTickCount64获取开机后毫秒数(不含休眠),Linux用/proc/uptime读取实际运行总秒数(含休眠),二者语义不同不可互换;GetTickCount因32位溢出(约49.7天)已被淘汰。

Windows:为什么不用 GetTickCount 而必须用 GetTickCount64

先说说Windows平台。老牌的GetTickCount函数返回一个32位无符号整数,这意味着它在大约49.7天后就会溢出归零。对于需要长期稳定运行的服务或嵌入式设备来说,这无疑是个定时冲击波——系统明明没重启,程序却可能误判为刚刚启动。

所以,答案很明确:必须使用它的64位升级版——GetTickCount64。它返回ULONGLONG类型,理论溢出周期长达约584年,足以应对绝大多数场景。

  • 链接与单位:函数位于kernel32.lib中(MSVC编译器通常默认已链接)。其返回值单位是毫秒,除以1000.0即可转换为秒级浮点数。
  • 关键语义:这里有个至关重要的细节:GetTickCount64的值从系统启动开始累计,但不计入系统进入睡眠或休眠状态的时间。换句话说,如果机器休眠了两小时再唤醒,这个计时器的数值并不会增加那两小时。
  • 示例代码
    ULONGLONG uptime_ms = GetTickCount64();

Linux:读 /proc/uptime 的正确姿势

转到Linux世界,获取启动时间的标准姿势是读取/proc/uptime这个虚拟文件。它比uptime命令更底层、更轻量,尤其适合嵌入式或需要高频采样的场景。

这个文件通常包含两个以空格分隔的浮点数:第一个字段是系统启动以来的实际运行总秒数(这个“实际”包含了系统休眠的时间);第二个字段则是总的空闲时间。

  • 读取方法:用C++的std::ifstream打开文件,直接读取第一个double值即可,简单高效。
  • 权限与精度:普通用户就有读取权限,无需root。其精度对于秒级应用完全足够;如果追求纳秒级精度,则应考虑结合clock_gettime(CLOCK_BOOTTIME, ...)
  • 示例代码
    std::ifstream f(“/proc/uptime”); double up_sec; f >> up_sec;

跨平台封装时最常踩的坑

到了封装跨平台接口这一步,才是真正考验理解深度的时候。最常见的错误,就是试图用一个宏或函数名统一两者,然后返回一个uint64_t类型的毫秒数。这忽略了最根本的语义差异:Windows不计休眠,Linux计入休眠。一旦机器进入休眠,两个平台返回的时间增量就会产生巨大分歧,直接导致依赖于此的监控、调度逻辑出错。

那么,正确的设计思路是什么?

  • 明确接口语义:在设计上,最好明确区分“系统运行时间”和“系统启动时刻”这两个概念。对于运行时间,各自使用原生方法获取。若需要计算启动的绝对时刻,Windows推荐用GetSystemTimeAsFileTime获取当前时间后反推,Linux则可用clock_gettime(CLOCK_BOOTTIME, ...)
  • 避开时间陷阱:千万不要用time(NULL) - boot_time这种方式来估算运行时间。系统时间可能被NTP校准或手动修改,这样计算的结果毫无可靠性可言。
  • 容器环境特例:在Docker等容器环境中,/proc/uptime反映的是宿主机的运行时间,而非容器自身的。如果需要容器的启动时间,需要另辟蹊径,例如通过检查/proc/1/stat来获取容器内第一个进程的启动时间戳。

立即学习“C++免费学习笔记(深入)”;

说到底,真正的难点不在于调用哪个API或读取哪个文件,而在于精确理解“系统启动时间”在你当前的上下文里究竟指代什么:是内核加载完成的那一刻?是第一个用户进程启动的瞬间?还是上次从休眠中恢复的时刻?选错了语义基准,后续的所有计算和判断都将失之毫厘,谬以千里。

本文转载于:https://www.php.cn/faq/2313024.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注