gettimeofday() - Unix,Linux系統呼叫
廣告
名稱gettimeofday, settimeofday - 獲取/設定時間概要
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
int settimeofday(const struct timeval *tv , const struct timezone *tz); 描述函式gettimeofday() 和 settimeofday() 可以獲取和設定時間以及時區。tv 引數是一個 struct timeval(如 <sys/time.h> 中所指定),
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
|
並給出自紀元(參見 time(2))以來的秒數和微秒數。tz 引數是一個 struct timezone。
struct timezone {
int tz_minuteswest; /* minutes west of Greenwich */
int tz_dsttime; /* type of DST correction */
};
|
如果 tv 或 tz 為 NULL,則不會設定或返回相應的結構。 timezone 結構的使用已過時;tz 引數通常應指定為 NULL。tz_dsttime 欄位在 Linux 下從未使用過;libc 或 glibc 不會並且將不會支援它。核心原始碼中該欄位的每次出現(宣告除外)都是一個錯誤。因此,以下是純粹的歷史意義。 tz_dsttime 欄位包含一個符號常量(值如下所示),指示一年中的哪個部分處於夏令時。(注意:它的值在一年中是恆定的:它並不表示夏令時生效,它只是選擇一種演算法。)定義的夏令時演算法如下:
DST_NONE /* 非夏令時 */
DST_USA /* 美國式夏令時 */
DST_AUST /* 澳大利亞式夏令時 */
DST_WET /* 西歐夏令時 */
DST_MET /* 中歐夏令時 */
DST_EET /* 東歐夏令時 */
DST_CAN /* 加拿大 */
DST_GB /* 大不列顛及愛爾蘭 */
DST_RUM /* 羅馬尼亞 */
DST_TUR /* 土耳其 */
DST_AUSTALT /* 1986 年更改的澳大利亞式夏令時 */ 當然,事實證明,夏令時生效的時期無法透過簡單的演算法(每個國家一個)給出;事實上,這一時期是由不可預測的政治決策決定的。因此,這種表示時區的方法已被放棄。在 Linux 下,在對 settimeofday() 的呼叫中,tz_dsttime 欄位應為零。 在 Linux 下,如果在第一次(啟動後)呼叫具有非 NULL tz 引數時,tv 引數為 NULL 且 tz_minuteswest 欄位非零,則與 settimeofday() 系統呼叫相關聯的一些特殊的“翹曲時鐘”語義。在這種情況下,假設 CMOS 時鐘處於當地時間,並且必須增加此數量才能獲得 UTC 系統時間。毫無疑問,使用此功能是個壞主意。 定義了以下宏來操作 struct timeval
#define timerisset(tvp)\
((tvp)->tv_sec || (tvp)->tv_usec)
#define timercmp(tvp, uvp, cmp)\
((tvp)->tv_sec cmp (uvp)->tv_sec ||\
(tvp)->tv_sec == (uvp)->tv_sec &&\
(tvp)->tv_usec cmp (uvp)->tv_usec)
#define timerclear(tvp)\
((tvp)->tv_sec = (tvp)->tv_usec = 0)
|
返回值
gettimeofday() 和 settimeofday() 成功返回 0,失敗返回 -1(在這種情況下,errno 被適當地設定)。錯誤
標籤 | 描述 |
EFAULT | tv 或 tz 指向可訪問地址空間之外。 |
EINVAL | 時區(或其他內容)無效。 |
EPERM | 呼叫程序沒有足夠的許可權來呼叫 settimeofday();在 Linux 下,需要 CAP_SYS_TIME 功能。 |
注意settimeofday() 的原型以及 timercmp、timerisset、timerclear、timeradd、timersub 的定義(自 glibc2.2.2 起)只有在定義了 _BSD_SOURCE 時才可用。傳統上,struct timeval 的欄位是長整型。 符合標準SVr4, 4.3BSD。POSIX.1-2001 描述了 gettimeofday() 但沒有描述 settimeofday()。參見
廣告
|