概述
名字
gettimeofday, settimeofday - get / set time
概要
#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():
Since glibc 2.19:
_DEFAULT_SOURCE
Glibc 2.19 and earlier:
_BSD_SOURCE
描述
函数gettimeofday()和settimeofday()可以获取或者设置时间和时区。tv参数是struct timeval (在<sys/time.h>中定义):
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/找到。
最后
以上就是俊秀石头为你收集整理的man 2 gettimeofday 翻译的全部内容,希望文章能够帮你解决man 2 gettimeofday 翻译所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复