gettimeofday() - Unix,Linux 系統呼叫 - 技術教學
Tutorials Point


  Unix 初學者指南
  Unix Shell 程式設計
  高階 Unix
  Unix 有用參考
  Unix 有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於 TP  

gettimeofday() - Unix,Linux 系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

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 */
};

如果 tvtz 為 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 引數的 settimeofday() 系統呼叫時,tv 引數為 NULL 且 tz_minuteswest 欄位非零,則會有一些特殊的“扭曲時鐘”語義。在這種情況下,假設 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 tvtz 指向可訪問地址空間之外。
EINVAL 時區(或其他內容)無效。
EPERM 呼叫程序沒有足夠的許可權來呼叫 settimeofday();在 Linux 下,需要 CAP_SYS_TIME 功能。

注意

settimeofday() 的原型以及 timercmptimerissettimercleartimeraddtimersub 的定義(自 glibc2.2.2 起)僅在定義了 _BSD_SOURCE 時才可用。

傳統上,struct timeval 的欄位是長整型。

符合標準

SVr4、4.3BSD。POSIX.1-2001 描述了 gettimeofday(),但沒有描述 settimeofday()。

參見



previous next Printer Friendly

廣告


  

廣告



廣告