gettimeofday() - Unix,Linux系统调用
广告
名称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 */
};
|
如果 tv 或 tz 为 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 参数时,tv 参数为 NULL 且 tz_minuteswest 字段非零,则与 settimeofday() 系统调用相关联的一些特殊的“翘曲时钟”语义。在这种情况下,假设 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 | tv 或 tz 指向可访问地址空间之外。 |
EINVAL | 时区(或其他内容)无效。 |
EPERM | 调用进程没有足够的权限来调用 settimeofday();在 Linux 下,需要 CAP_SYS_TIME 功能。 |
注意settimeofday() 的原型以及 timercmp、timerisset、timerclear、timeradd、timersub 的定义(自 glibc2.2.2 起)只有在定义了 _BSD_SOURCE 时才可用。传统上,struct timeval 的字段是长整型。 符合标准SVr4, 4.3BSD。POSIX.1-2001 描述了 gettimeofday() 但没有描述 settimeofday()。参见
广告
|