如何在32位时间库中使用mktime64()、time64()和localtime64()函数?

pxyaymoc  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(150)

如何在Linux中使用mktime64()和32位时间库来避免2038年问题?
我们尝试使用宏_Time64,但失败了,因为编译器仍然抛出未定义的mktime64()错误:

typedef long long _Time64_t;

_Time64_t _Time64(_Time64_t *pt);

struct tm *_Localtime64(_Time64_t *pt);

_Time64_t _mktime64(_Time64_t pt);

字符串
main.c:(.text+0x68):对_mktime64'的未定义引用 请问如何使用mktime64time64localtime64`函数使用32位库?

atmip9wb

atmip9wb1#

Linux上的C标准库(CRT)只有一个time_t类型,因此没有适合您的_mktime64
在32位Windows上,有两种不同的time_t类型(__time32_t and __time64_t)和两种版本的时间函数(如_mktime32 and _mktime64),这是因为Microsoft * 逐渐在不破坏旧代码的情况下向其CRT* 添加了64位时间支持。像time_tmktime这样的标准标识符实际上是宏,将被定义为所需的32位或64位版本。time_t在VS2015中默认更改为64位,因此此后编译的所有应用程序都不会受到2038年问题的影响。更多信息请阅读Another look at the year 2038 problem
Linux CRT通过立即将time_t更改为64位类型而无需任何渐进的中间步骤来解决2038年问题。在64位Linux中,从第一次构建开始就发生了这种情况。但在32位Linux中,这发生得要晚得多,直到2020年才在Linux内核5.6或更新版本上运行glibc 2.32+和musl 1.2+。所以**为了避免32位Linux上的2038年问题,你 * 必须使用足够新的内核和CRT*

  • 所有用户空间都必须使用64位time_t编译,这将在即将发布的musl-1.2和glibc-2.32版本中得到支持,沿着安装linux-5.6或更高版本的内核头文件。
  • 直接使用系统调用接口的应用程序需要移植到使用linux-5.1中添加的time64系统调用来代替现有的系统调用。这影响了futex()seccomp()的大多数用户,以及拥有自己的运行时环境而不是基于libc的编程语言。

https://lkml.org/lkml/2020/1/29/355?anz=web
如果你不能升级CRT和内核版本,那么你需要使用像evalEmpire/y2038这样的第三方库,但是很明显,当涉及到实际的2038时,库可能无法从内核获得真实的系统时间。希望你在那个时候不要用这么古老的内核
这是POSIX time. h的一个实现,它解决了time_t只有32位的系统上的2038年错误。它是用标准ANSI C实现的。
如果您的内核版本介于5.1和5.6之间,那么您也可以编写自己的 Package 器函数,因为32位平台上的64位时间支持是introduced to the Linux 5.1 kernel,并添加了新的*time64 syscalls
更多信息请阅读

相关问题