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)并返回错误,而不是崩溃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提出了一些更严格的要求。