如何在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'的未定义引用 请问如何使用
mktime64,
time64和
localtime64`函数使用32位库?
2条答案
按热度按时间atmip9wb1#
Linux上的C标准库(CRT)只有一个
time_t
类型,因此没有适合您的_mktime64
在32位Windows上,有两种不同的
time_t
类型(__time32_t
and__time64_t
)和两种版本的时间函数(如_mktime32
and_mktime64
),这是因为Microsoft * 逐渐在不破坏旧代码的情况下向其CRT* 添加了64位时间支持。像time_t
或mktime
这样的标准标识符实际上是宏,将被定义为所需的32位或64位版本。time_t
在VS2015中默认更改为64位,因此此后编译的所有应用程序都不会受到2038年问题的影响。更多信息请阅读Another look at the year 2038 problemLinux CRT通过立即将
time_t
更改为64位类型而无需任何渐进的中间步骤来解决2038年问题。在64位Linux中,从第一次构建开始就发生了这种情况。但在32位Linux中,这发生得要晚得多,直到2020年才在Linux内核5.6或更新版本上运行glibc 2.32+和musl 1.2+。所以**为了避免32位Linux上的2038年问题,你 * 必须使用足够新的内核和CRT*time_t
编译,这将在即将发布的musl-1.2和glibc-2.32版本中得到支持,沿着安装linux-5.6或更高版本的内核头文件。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。更多信息请阅读
whhtz7ly2#
这些函数似乎是Microsoft only