Linux 系统中提供了多种高精度时间函数,能够满足纳秒级、微秒级和毫秒级的时间测量需求,这些函数在系统性能分析、实时任务调度、网络通信等领域发挥着重要作用,本文将重点介绍 Linux 中常用的毫秒级时间函数,包括其使用方法、注意事项及典型应用场景。

毫秒级时间获取函数
在 Linux 中,获取当前时间的毫秒级时间戳主要有以下几种方式:
clock_gettime() 函数
clock_gettime() 是 POSIX 标准中推荐的高精度时间获取函数,支持多种时钟源,对于毫秒级时间获取,通常使用 CLOCK_REALTIME 或 CLOCK_MONOTONIC 时钟。
#include <time.h> int clock_gettime(clockid_t clk_id, struct timespec *tp);
clk_id:时钟类型,CLOCK_REALTIME表示实时时间(受系统时间调整影响),CLOCK_MONOTONIC表示单调递增时间(不受系统时间调整影响)。tp:返回的时间结构体,包含tv_sec(秒)和tv_nsec(纳秒)。
转换为毫秒时间戳的公式为:timestamp_ms = tp->tv_sec * 1000 + tp->tv_nsec / 1000000。
gettimeofday() 函数(已废弃)
gettimeofday() 是传统的微秒级时间函数,虽然已在新标准中标记为废弃,但在一些旧代码中仍广泛使用。
#include <sys/time.h> int gettimeofday(struct timeval *tv, struct timezone *tz);
tv:返回的时间结构体,包含tv_sec(秒)和tv_usec(微秒)。- 转换为毫秒时间戳:
timestamp_ms = tv->tv_sec * 1000 + tv->tv_usec / 1000。
毫秒级休眠函数
在 Linux 中,实现毫秒级休眠主要有以下两种方式:

nanosleep() 函数
nanosleep() 是 POSIX 标准推荐的休眠函数,精度可达纳秒级。
#include <time.h> int nanosleep(const struct timespec *req, struct timespec *rem);
req:请求休眠的时间,包含tv_sec和tv_nsec。- 休眠 100 毫秒:
struct timespec ts = {0, 100000000}; nanosleep(&ts, NULL);。
usleep() 函数(已废弃)
usleep() 是微秒级休眠函数,最大休眠时间为 1 秒。
#include <unistd.h> unsigned int usleep(useconds_t usec);
- 休眠 100 毫秒:
usleep(100000);。
函数对比与选择
| 函数名 | 精度 | 时钟源/类型 | 备注 |
|---|---|---|---|
clock_gettime |
纳秒级 | 支持多种时钟 | 推荐使用,精度高,功能全面 |
gettimeofday |
微秒级 | 实时时间 | 已废弃,兼容性好 |
nanosleep |
纳秒级 | 推荐使用,高精度休眠 | |
usleep |
微秒级 | 已废弃,简单易用 |
注意事项
-
时钟选择:
- 需要绝对时间时使用
CLOCK_REALTIME,如日志记录; - 需要稳定时间间隔时使用
CLOCK_MONOTONIC,如性能测试。
- 需要绝对时间时使用
-
精度限制:
- 实际精度受系统调度和硬件影响,通常无法达到理论纳秒级;
- 高频调用时可能因系统调用开销导致误差。
-
线程安全:

上述函数均为线程安全,可在多线程环境中直接使用。
典型应用场景
- 性能测试:使用
clock_gettime(CLOCK_MONOTONIC)测量代码执行时间,避免系统时间调整的影响。 - 实时控制:在嵌入式系统中,通过
nanosleep()实现精确的任务周期调度。 - 网络通信:计算数据包往返时间(RTT)时,使用毫秒级时间戳进行时间差计算。
Linux 毫秒级时间函数为开发者提供了灵活且高效的时间操作工具,合理选择和使用这些函数能够显著提升程序的准确性和可靠性,在实际开发中,需根据应用场景需求权衡精度、兼容性和性能,选择最合适的方案。

















