time in time.h 什么情况下会失效?
Under what circumstances can time in time.h fail?
header time.h
中的 time
函数由 POSIX 到 return a time_t
定义,显然可以是有符号整数或某种浮点数。
http://en.cppreference.com/w/c/chrono/time
但是函数 returns (time_t)(-1)
出错。
什么情况下time
会失败?
根据签名,time_t time( time_t *arg )
函数似乎不应该分配,所以这是失败的一个潜在原因。
我可以想象几个原因:
- 硬件定时器不可用,因为硬件不支持。
- 硬件定时器刚刚失败(硬件错误,由于某种原因无法访问定时器寄存器)
arg
不为空,但指向一些非法位置。一些实现可以检测到非法指针(或捕获生成的 SEGV)而不是崩溃,而是 return 一个错误。
- 在提供的 link "Implementations in which time_t is a 32-bit signed integer (many historical implementations) fail in the year 2038." 中。因此,自纪元 (1/1/1970) 起 1<<31 秒后,时间 return 值溢出(好吧,也就是说,如果硬件也没有通过静默溢出来掩盖问题)。
time()
函数实际上是由 ISO 定义的,POSIX 大部分都遵循它,除了它可能对行为 and/or 属性(如 eight-bit 字节进行进一步限制,例如)。
而且,由于 ISO C 标准没有指定如何 time()
可能会失败(a),列表可能性不限于任何方式:
- 它可能失败的一种方式是在嵌入式领域。您的 C 程序很可能 运行 在没有 real-time 时钟或其他时钟硬件(甚至是计数器)的设备上,在这种情况下,将没有时间可用。
- 或者该函数可能检测到 错误 时钟硬件不断跳动,因此不可靠。
- 或者您可能 运行 处于 real-time 环境中,在该环境中访问时钟硬件 time-expensive 因此,如果它检测到您过于频繁地这样做,它会决定开始失败,这样你的代码就可以做它应该做的事情:-)
可能性实际上是无限的,当然,我指的是比喻意义上的 'literally',而不是字面上的 :-)
POSIX 本身调用 显式 如果它检测到值不适合 time_t
变量,它将失败:
The time()
function may fail if: [EOVERFLOW]
The number of seconds since the Epoch will not fit in an object of type time_t
.
并且,就您的评论而言:
Based on the signature, time_t time( time_t *arg )
, it seems like the function shouldn't allocate.
你需要对此保持谨慎。标准未规定的任何内容都完全可以解释。例如,我可以设想一个奇怪的实现,它为 NTP 请求数据包分配 space 以发送到 time.nist.somewhere.org
,以确保所有时间都是最新的,即使 没有 [=56] =] 一个 NTP 客户端 :-)
(a) 事实上,它甚至没有指定 time_t
的 definition 是什么,所以这是不明智的要将其限制为整数或浮点值,它可以是自大爆炸以来的两周数的字符串表示形式 :-) 它所需要的只是它可以被其他 time.h
函数使用并且它可以是失败时转换为 -1
。
POSIX 表示它表示秒数(ISO 没有),但没有其他限制。
header time.h
中的 time
函数由 POSIX 到 return a time_t
定义,显然可以是有符号整数或某种浮点数。
http://en.cppreference.com/w/c/chrono/time
但是函数 returns (time_t)(-1)
出错。
什么情况下time
会失败?
根据签名,time_t time( time_t *arg )
函数似乎不应该分配,所以这是失败的一个潜在原因。
我可以想象几个原因:
- 硬件定时器不可用,因为硬件不支持。
- 硬件定时器刚刚失败(硬件错误,由于某种原因无法访问定时器寄存器)
arg
不为空,但指向一些非法位置。一些实现可以检测到非法指针(或捕获生成的 SEGV)而不是崩溃,而是 return 一个错误。- 在提供的 link "Implementations in which time_t is a 32-bit signed integer (many historical implementations) fail in the year 2038." 中。因此,自纪元 (1/1/1970) 起 1<<31 秒后,时间 return 值溢出(好吧,也就是说,如果硬件也没有通过静默溢出来掩盖问题)。
time()
函数实际上是由 ISO 定义的,POSIX 大部分都遵循它,除了它可能对行为 and/or 属性(如 eight-bit 字节进行进一步限制,例如)。
而且,由于 ISO C 标准没有指定如何 time()
可能会失败(a),列表可能性不限于任何方式:
- 它可能失败的一种方式是在嵌入式领域。您的 C 程序很可能 运行 在没有 real-time 时钟或其他时钟硬件(甚至是计数器)的设备上,在这种情况下,将没有时间可用。
- 或者该函数可能检测到 错误 时钟硬件不断跳动,因此不可靠。
- 或者您可能 运行 处于 real-time 环境中,在该环境中访问时钟硬件 time-expensive 因此,如果它检测到您过于频繁地这样做,它会决定开始失败,这样你的代码就可以做它应该做的事情:-)
可能性实际上是无限的,当然,我指的是比喻意义上的 'literally',而不是字面上的 :-)
POSIX 本身调用 显式 如果它检测到值不适合 time_t
变量,它将失败:
The
time()
function may fail if:[EOVERFLOW]
The number of seconds since the Epoch will not fit in an object of typetime_t
.
并且,就您的评论而言:
Based on the signature,
time_t time( time_t *arg )
, it seems like the function shouldn't allocate.
你需要对此保持谨慎。标准未规定的任何内容都完全可以解释。例如,我可以设想一个奇怪的实现,它为 NTP 请求数据包分配 space 以发送到 time.nist.somewhere.org
,以确保所有时间都是最新的,即使 没有 [=56] =] 一个 NTP 客户端 :-)
(a) 事实上,它甚至没有指定 time_t
的 definition 是什么,所以这是不明智的要将其限制为整数或浮点值,它可以是自大爆炸以来的两周数的字符串表示形式 :-) 它所需要的只是它可以被其他 time.h
函数使用并且它可以是失败时转换为 -1
。
POSIX 表示它表示秒数(ISO 没有),但没有其他限制。