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

广告


  

广告



广告