man 2 gettimeofday 翻译

名字

gettimeofday, settimeofday - get / set time

概要

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

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

glibc需要的特征测试宏(查看 feature_test_macros(7)):

settimeofday():
    Since glibc 2.19:
        _DEFAULT_SOURCE
    Glibc 2.19 and earlier:
        _BSD_SOURCE

描述

函数gettimeofday()和settimeofday()可以获取或者设置时间和时区。tv参数是struct timeval (在中定义):

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

并且给出从Epoch到现在的时间是多少秒,多少毫秒(查看time(2))。tz参数是struct timezone:

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

如果tv和tz中有一个是NULL,那么对应结构就不再设置或者返回。(但是,如果tv是NULL会产生编译警告。)。

timezone结构的使用被非废弃了,tz参数一般使用NULL,(请看下面的注释)。

在Linux下面,如果启动之后第一次调用settimeofday()的时候参数tz不是NULL,tv是NULL,然后tz_minuteswest非零的话(这里的tz_dsttime应该是0),会有一些歪曲时钟的语义产生。这种情况下,假定CMOS时钟是本地时间,并且需要增长一定数量的时间来得到UTC系统时间。毫无疑问,使用这样的特性是一个糟糕的想法。

返回值

gettimeofday()和settimeofday()在成功的时候返回0,在失败的时候返回-1(errno也会进行设置)。

错误

EFAULT tv或者tz指向了不能访问的内存空间

EINVAL Timezone无效

EPERM 调用进程没有足够的权限调用settimeofday();当前Linux需要CAP_SYS_TIME功能。

规范

SVr4, 4.3BSD. POSIX.1-2001描述gettimeofday()但是没有描述settimeofday()。POSIX.1-2008把gettimeofday()标记为废弃的。推荐使用clock_get-time(2)。

注释

gettimeofday()返回的时间会受到系统时间不连续跳跃的影响(比如系统管理员人为的改变了系统时间)。如果你想要一个单调增长的时钟,请看clock_gettime(2)。

timeradd(3)描述了操作timeval结构的宏。

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

C library/kernel 差别

在有些系统架构上,vdso(7)提供了gettimeofday()的实现。

tz_dsttime字段

在一个非Linux内核上,但是用的是glibc,如果当前时区曾经有过或者想要设置daylight saving规则,gettimeofday()会把struct timezone的tz_dsttime字段设置为非零值。这样的话,它的意思就和daylight(3)的意义一样了。在Linux上面,glibc的gettimeofday()和settimeofday()的tz_dsttime永远不会用。因此下面的描述,就仅仅是为了记叙一下历史。

在老的系统上,字段tz_dsttime包含一个符号常量(下面列出),这个符号常量表明一年中的什么时候,Daylight Saving Time会使用。(注意:这个值全年都是常量,这并不表明DST会用,只是说选择某一个算法)。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_CAN      /* Canada */
DST_GB       /* Great Britain and Eire */
DST_RUM      /* Romania */
DST_TUR      /* Turkey */
DST_AUSTALT  /* Australian style with shift in 1986 */

当然啥时候使用DST不是由一个简单的算法决定的,也不是由一个国家决定的。事实上,这个时间点受到无法预测的政治决策影响。所以这种表示时区的方法已经被废弃了。

参考

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

版权

本页是Linux 4.15 man-pages项目的一部分。项目的描述,报bugs相关信息,以及本页的最新版本都可以在https://www.kernel.org/doc/man-pages/找到。

 

你可能感兴趣的:(C语言,Linux-Unix)