GETTIMEOFDAY - Linux手册页

时间:2019-08-20 17:58:51  来源:igfitidea点击:

Linux程序员手册 第2部分
更新日期: 2019-03-06

名称

gettimeofday,settimeofday-获取/设置时间

语法

#include <sys/time.h>

int gettimeofday(struct timeval *tv, struct timezone *tz);

int settimeofday(const struct timeval *tv, const struct timezone *tz);

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

settimeofday():
从glibc 2.19开始:
_DEFAULT_SOURCE
Glibc 2.19及更早版本:
_BSD_SOURCE

说明

函数gettimeofday()和settimeofday()可以获取和设置时间以及时区。

tv参数是一个struct timeval(如中所指定):

struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};

并给出自历元以来的秒数和微秒数(请参见time(2))。

tz参数是一个结构时区:

struct timezone {
    int tz_minuteswest;     /* minutes west of Greenwich */
    int tz_dsttime;         /* type of DST correction */
};

如果tv或tz为NULL,则不设置或返回相应的结构。 (但是,如果tv为NULL,将产生编译警告。)

时区结构的使用已过时; tz参数通常应指定为NULL。 (请参阅下面的注释。)

在Linux下,如果在第一次调用(引导后)具有非NULL tz参数,tv参数为NULL和tz_minuteswest字段为非零的第一次调用中,则与settimeofday()系统调用相关联的某些特殊的"扭曲时钟"语义。 (在这种情况下,tz_dsttime字段应为零。)在这种情况下,假定CMOS时钟位于本地时间,并且必须增加此数量才能获得UTC系统时间。无疑,使用此功能不是一个好主意。

返回值

gettimeofday()和settimeofday()对于成功返回0,对于失败返回-1(在这种情况下,将errno进行适当设置)。

错误说明

EFAULT
指向可访问地址空间之外的tv或tz之一。
EINVAL
(settimeofday()):时区无效。
EINVAL
(settimeofday()):tv.tv_sec为负或tv.tv_usec超出[0..999,999]范围。
EINVAL(since Linux 4.3)
(settimeofday()):尝试将时间设置为小于CLOCK_MONOTONIC时钟的当前值的值(请参见clock_gettime(2))。
EPERM
调用过程没有足够的特权来调用settimeofday();。在Linux下,需要CAP_SYS_TIME功能。

遵循规范

SVr4、4.3BSD。 POSIX.1-2001描述了gettimeofday()而不是settimeofday()。 POSIX.1-2008将gettimeofday()标记为已过时,建议改为使用clock_gettime(2)。

备注

gettimeofday()返回的时间受系统时间的不连续跳跃影响(例如,如果系统管理员手动更改系统时间)。如果需要单调增加的时钟,请参见clock_gettime(2)。

用于timeval结构的宏在timeradd(3)中进行了描述。

传统上,struct timeval的字段是long类型的。

C library/kernel differences

在某些体系结构上,vdso(7)中提供了gettimeofday()的实现。

The tz_dsttime field

在具有glibc的非Linux内核上,如果当前时区已经或将应用夏令时,则通过gettimeofday()将struct timezone的tz_dsttime字段设置为非零值。从这个意义上讲,它恰好反映了当前区域的daylight(3)的含义。在Linux上,使用glibc,settimeofday()或gettimeofday()从未使用过struct timezone的tz_dsttime字段的设置。因此,以下内容纯粹具有历史意义。

在旧系统上,字段tz_dsttime包含一个符号常量(值在下面给出),该符号常量指示夏令时在一年的哪部分生效。 (注意:此值在一年中是恒定的:它并不表示DST生效,它只是选择一种算法。)定义的夏时制算法如下:

DST_NONE     /* not on DST */
DST_USA      /* USA style DST */
DST_AUST     /* Australian style DST */
DST_WET      /* Western European DST */
DST_MET      /* Middle European DST */
DST_EET      /* Eastern European DST */
DST_CAN      /* Canada */
DST_GB       /* Great Britain and Eire */
DST_RUM      /* Romania */
DST_TUR      /* Turkey */
DST_AUSTALT  /* Australian style with shift in 1986 */

当然,事实证明,不能通过一种简单的算法(每个国家/地区指定一个时间)来指定夏令时的有效期。实际上,这一时期是由不可预测的政治决定所决定的。因此,这种表示时区的方法已被放弃。

另外参见

date(1),adjtimex(2),clock_gettime(2),time(2),ctime(3),ftime(3),timeradd(3),capabilities(7),time(7),vdso(7), hwclock(8)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/