在什么情况下,时间可能会失败?

时间:2018-03-02 02:38:56

标签: c posix

标头time中的time.h函数由POSIX定义,以返回time_t,显然可以是带符号的int或某种浮点数。

http://en.cppreference.com/w/c/chrono/time

但是,该函数在出错时返回(time_t)(-1)

time失败的情况下?

基于签名time_t time( time_t *arg ),似乎函数不应该分配,因此可能会导致失败。

2 个答案:

答案 0 :(得分:4)

time()函数实际上由ISO定义,POSIX主要推迟到该函数,除非它可能对行为和/或属性进行进一步限制(例如,如8位字节)。

并且,由于ISO C标准未指定 time()如何失败(a),因此可能性列表不限于任何方式:

  • 可能失败的一种方式是嵌入式竞技场。您的C程序很可能在没有实时时钟或其他时钟硬件(甚至是计数器)的设备上运行,在这种情况下,没有时间可用。
  • 或者该函数可能会检测到时钟硬件,这些硬件经常在各处跳跃,因此不可靠。
  • 或许你是在一个实时环境中运行的,那时对时钟硬件的访问费用很高,所以,如果它检测到你经常这样做,它会决定开始失败,所以你的代码可以做到这一点。意图做: - )

可能性实际上是无限的,当然,我的意思是“字面上”在比喻意义上而不是文字意义上: - )

POSIX本身调出显式,如果它检测到该值不适合time_t变量,它将失败:

  

time()函数可能会失败如果:[EOVERFLOW]自Epoch以来的秒数不适合time_t类型的对象。

而且,就在您的评论中:

  

根据签名time_t time( time_t *arg ),似乎函数不应该分配。

你需要对此保持谨慎。任何非标准规定的内容都完全可以解释。例如,我可以设想一个奇怪的实现,为NTP请求数据包分配空间到time.nist.somewhere.org,以确保所有时间都是最新的,即使没有 NTP客户端: - )

(a)实际上,它甚至没有指定time_t定义是什么,因此将它限制为整数或浮动是不明智的点值,它可能是自大爆炸以来的四夜之数的字符串表示:-)所有它需要的是它可以被其他time.h函数使用并且它可以被强制转换为-1 in失败的事件。

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

答案 1 :(得分:3)

我可以想象几个原因:

  1. 硬件计时器不可用,因为硬件不支持它。
  2. 硬件定时器失败(硬件错误,由于某种原因无法访问定时器寄存器)
  3. arg不为空,但指向某个非法位置。某些实现可能会检测到非法指针(或捕获生成的SEGV)而不是崩溃,而是返回错误。
  4. 在提供的链接“2038年,time_t是32位有符号整数(许多历史实现)的实现失败。”。因此,自纪元(1970年1月1日)以来1<< 31秒之后,时间返回值溢出(好吧,也就是说,如果硬件没有通过静默溢出来掩盖问题)。