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 ) 函数似乎不应该分配,所以这是失败的一个潜在原因。

我可以想象几个原因:

  1. 硬件定时器不可用,因为硬件不支持。
  2. 硬件定时器刚刚失败(硬件错误,由于某种原因无法访问定时器寄存器)
  3. arg 不为空,但指向一些非法位置。一些实现可以检测到非法指针(或捕获生成的 SEGV)而不是崩溃,而是 return 一个错误。
  4. 在提供的 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_tdefinition 是什么,所以这是不明智的要将其限制为整数或浮点值,它可以是自大爆炸以来的两周数的字符串表示形式 :-) 它所需要的只是它可以被其他 time.h 函数使用并且它可以是失败时转换为 -1

POSIX 表示它表示秒数(ISO 没有),但没有其他限制。