C 在什么情况下time.h会失败?

C 在什么情况下time.h会失败?,c,posix,C,Posix,头文件time.h中的time函数由POSIX定义,用于返回time\u t,显然,它可以是有符号整数或某种浮点数 但是,该函数在出错时返回(time\u t)(-1) 在什么情况下,时间会失败 根据签名,time\u t time(time\u t*arg)函数似乎不应该分配,因此会导致一个潜在的故障原因。我可以想象出几个原因: 硬件计时器不可用,因为硬件不支持它 硬件计时器刚刚失败(硬件错误,由于某种原因无法访问计时器寄存器) arg不为空,但指向某个非法位置。一些实现可以检测非法指针(或

头文件
time.h
中的
time
函数由POSIX定义,用于返回
time\u t
,显然,它可以是有符号整数或某种浮点数

但是,该函数在出错时返回
(time\u t)(-1)

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


根据签名,
time\u t time(time\u t*arg)
函数似乎不应该分配,因此会导致一个潜在的故障原因。

我可以想象出几个原因:

  • 硬件计时器不可用,因为硬件不支持它
  • 硬件计时器刚刚失败(硬件错误,由于某种原因无法访问计时器寄存器)
  • arg
    不为空,但指向某个非法位置。一些实现可以检测非法指针(或捕获结果SEGV)并返回错误,而不是崩溃
  • 在提供的链接中,“时间为32位有符号整数的实现(许多历史实现)在2038年失败。”。因此,在1之后,
    time()
    函数实际上是由ISO定义的,POSIX主要遵从该函数,除非它可能对行为和/或属性(例如,8位字节)施加进一步的限制

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

    • 它可能失败的一种方式是在嵌入式竞技场中。很有可能您的C程序运行在没有实时时钟或其他时钟硬件(甚至计数器)的设备上,在这种情况下,没有可用的时间
    • 或者,该功能可能检测到坏的时钟硬件,这些硬件不断地四处跳跃,因此不可靠
    • 或者,您可能运行在一个实时环境中,在这个环境中,访问时钟硬件的时间非常昂贵,因此,如果它检测到您经常这样做,它就会决定开始失败,这样您的代码就可以执行它应该执行的操作:-)
    从字面上看,可能性是无限的,当然,我指的是比喻意义上的“字面”,而不是字面意义上的:-)


    POSIX本身明确指出,如果检测到值不适合
    时间\u t
    变量,它将失败:

    time()
    函数可能会失败,如果:
    [EOVERFLOW]
    自纪元起的秒数不适合
    time类型的对象


    就在你的评论中:

    根据签名,
    time\u t time(time\u t*arg)
    ,函数似乎不应该分配

    在这件事上你需要谨慎。任何不受标准约束的内容都可以解释。例如,我可以设想一个奇怪的实现,为NTP请求数据包分配空间,以便发送到
    time.nist.somewhere.org
    ,从而确保即使没有NTP客户端,所有时间都是最新的:-)


    (a) 事实上,它甚至没有指定时间的定义,因此将其限制为整数或浮点值是不明智的,它可以是自大爆炸以来两周数的字符串表示:-)它所需要的只是它可以被其他
    time.h
    函数使用,并且在发生故障时可以转换为
    -1


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

    POSIX说
    time()
    失败于
    EOVERFLOW
    ,如果“从纪元开始的秒数将不适合
    time\t
    类型的对象”。那么你是指2038c错误。是的,以及它的变体。在64位系统上,可能存在Y292277026596错误。其他系统使用的是1970年以外的年代。您究竟为什么要使用“cppreference.com”作为C文档的来源?是的,C++和C是相关的,但还是不一样。对于POSIX,使用标准。对于C和POSIX函数(不包括微软设法塞进C11中的大多数愚蠢的
    \s
    函数,Windows之外的任何人都不会使用这些函数),使用;大多数页面都包含一个“符合”部分,该部分描述了该功能的相关标准。它们对特定于C的内容的覆盖非常好,页面引用了相关标准。不过请注意,下次我将使用更好的源代码。ISO C规定
    time\u t
    clock\u t
    必须是“能够表示时间的实类型”——即
    time\u t
    必须是整数(有符号或无符号)或浮点。(它不可能是一个复杂的类型。)但它没有说明它是如何表示时间的;它可以使用
    20180302204129
    来表示当前时间(正如我键入的那样)。POSIX提出了一些更严格的要求。