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

问题描述 投票:2回答:2

标题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 )似乎函数不应该分配,因此这可能导致失败的一个潜在原因。

c posix
2个回答
4
投票

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

并且,由于ISO C标准没有规定time()如何失败(a),因此可能性列表不受任何限制:

  • 它可能失败的一种方式是在嵌入式领域。您的C程序很可能在没有实时时钟或其他时钟硬件(甚至是计数器)的设备上运行,在这种情况下,没有时间可用。
  • 或者,该功能可能会检测出不断跳跃的坏时钟硬件,因此不可靠。
  • 或者你可能在一个实时环境中运行时,对时钟硬件的访问是非常昂贵的,所以,如果它检测到你经常这样做,它会决定开始失败,所以你的代码可以做到它的意思做:-)

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


如果POSIX检测到该值不适合time_t变量,则POSIX本身会明确地调用它将失败:

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


而且,就你的评论而言:

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

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


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

POSIX确实声明它表示秒数(ISO没有),但没有对其进行任何其他限制。


3
投票

我可以想象几个原因:

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