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
。