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 参数的 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 | 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()。参见
广告
|