gettimeofday
是 Linux 系统中一个用于获取当前时间的系统调用函数。它能够获取从 Unix 纪元(1970年1月1日 00:00:00 UTC)到当前时刻的秒数和微秒数。
函数原型
#include <sys/time.h>int gettimeofday(struct timeval *tv, struct timezone *tz);
参数说明
tv
: 指向struct timeval
结构体的指针,用于存储获取到的时间。tz
: 指向struct timezone
结构体的指针,用于存储时区信息。注意:在现代 Linux 系统中,这个参数通常被忽略(应设为NULL
),因为内核不再使用它。
数据结构体
struct timeval {time_t tv_sec; /* 秒(从 Unix 纪元开始) */suseconds_t tv_usec; /* 微秒(0 到 999,999) */
};struct timezone {int tz_minuteswest; /* 格林威治以西的分钟数 */int tz_dsttime; /* 夏令时标志 */
};
返回值
- 成功时返回 0。
- 失败时返回 -1,并设置
errno
错误码。
使用示例
#include <stdio.h>
#include <sys/time.h>int main() {struct timeval tv;if (gettimeofday(&tv, NULL) == 0) {printf("秒数: %ld\n", tv.tv_sec);printf("微秒: %ld\n", tv.tv_usec);} else {perror("gettimeofday");return 1;}return 0;
}
注意事项
- 精度:
gettimeofday
提供微秒级精度,但实际精度取决于系统硬件和内核实现。 - 时区参数:现代系统中,
tz
参数应始终设为NULL
。 - 线程安全:
gettimeofday
是线程安全的。 - 已废弃:虽然
gettimeofday
仍在广泛使用,但 POSIX 标准推荐使用更现代的clock_gettime()
函数,它提供了更高的精度(纳秒级)和更多的时间源选择(如CLOCK_REALTIME
,CLOCK_MONOTONIC
等)。
推荐替代方案
#include <time.h>int clock_gettime(clockid_t clk_id, struct timespec *tp);
clock_gettime
使用 struct timespec
结构体,提供纳秒级精度:
struct timespec {time_t tv_sec; /* 秒 */long tv_nsec; /* 纳秒 */
};
总的来说,gettimeofday
是一个经典且广泛使用的函数,但在新代码中建议优先考虑 clock_gettime
。