嵌入式 Linux(32 位)的 2038 年解决方案?
Year 2038 solution for embedded Linux (32 bit)?
在 32 位嵌入式 Linux (ARMLinux) 的 C 代码中处理时间的正确方法是什么,以确保代码在 03:14:07 UTC 之后继续正常工作2038 年 1 月 19 日(当有符号的 32 位 time_t
溢出时)?鉴于 time_t
在我必须使用的系统上是 32 位签名的,有哪些替代方案?
大量谷歌搜索没有发现任何实际用途。每个人似乎都认为到那时我们都将使用 64 位操作系统,但显然嵌入式系统并非如此。
在我需要使用的系统上,__kernel_time_t
被定义为 long
。这大概意味着没有用于 64 位时间的内核设施。 uClibc的版本是0.9.29.
我不敢相信我是唯一遇到这个问题的人,我不想重新发明轮子。
如果时间戳低于特定值,时间转换例程将 "simply" 必须使用 2038-01-19:03:14:07Z 作为 Unix 纪元时间的基础。
即如果您的系统在 2010 年 1 月 1 日投入生产,您可以假设没有时间戳(未溢出)低于 1262300400(该日期的 unix 纪元时间)。
如果遇到更小的时间戳,则认为已经溢出,以2038-01-19:03:14:07Z为基准时间。也必须考虑比较。
不是一个干净的解决方案,但可以通过适度的努力实现。最好切换到 64 位时间戳(顺便说一句,这并不绝对需要 64 位系统)。
我假设您的嵌入式系统的 ABI 将 long
定义为 32 位。
time_t
类型不需要签名。您能否做到 unsigned long
并为自己和您的后代多买 68 年的安宁?更改此设置需要重新编译内核、C 库以及所有使用 time_t
的程序和库...胆小者不宜!你不妨定义为long long
,但这会改变很多结构布局,更具挑战性。
没有灵丹妙药、技巧或聪明的解决方案。使用具有 64 位 time_t
的操作系统或不使用 time_t
和任何依赖于它的 OS 设施(包括文件系统、计时器、半个网络等)或计划在未来20年更新软件。
在 32 位机器上至少有两个 unix-like 64 位系统 time_t
:OpenBSD 和 NetBSD。 OpenBSD 进行了几次会谈,解释了其背后的原因:http://www.openbsd.org/papers/eurobsdcon_2013_time_t/index.html
在 32 位嵌入式 Linux (ARMLinux) 的 C 代码中处理时间的正确方法是什么,以确保代码在 03:14:07 UTC 之后继续正常工作2038 年 1 月 19 日(当有符号的 32 位 time_t
溢出时)?鉴于 time_t
在我必须使用的系统上是 32 位签名的,有哪些替代方案?
大量谷歌搜索没有发现任何实际用途。每个人似乎都认为到那时我们都将使用 64 位操作系统,但显然嵌入式系统并非如此。
在我需要使用的系统上,__kernel_time_t
被定义为 long
。这大概意味着没有用于 64 位时间的内核设施。 uClibc的版本是0.9.29.
我不敢相信我是唯一遇到这个问题的人,我不想重新发明轮子。
如果时间戳低于特定值,时间转换例程将 "simply" 必须使用 2038-01-19:03:14:07Z 作为 Unix 纪元时间的基础。
即如果您的系统在 2010 年 1 月 1 日投入生产,您可以假设没有时间戳(未溢出)低于 1262300400(该日期的 unix 纪元时间)。
如果遇到更小的时间戳,则认为已经溢出,以2038-01-19:03:14:07Z为基准时间。也必须考虑比较。
不是一个干净的解决方案,但可以通过适度的努力实现。最好切换到 64 位时间戳(顺便说一句,这并不绝对需要 64 位系统)。
我假设您的嵌入式系统的 ABI 将 long
定义为 32 位。
time_t
类型不需要签名。您能否做到 unsigned long
并为自己和您的后代多买 68 年的安宁?更改此设置需要重新编译内核、C 库以及所有使用 time_t
的程序和库...胆小者不宜!你不妨定义为long long
,但这会改变很多结构布局,更具挑战性。
没有灵丹妙药、技巧或聪明的解决方案。使用具有 64 位 time_t
的操作系统或不使用 time_t
和任何依赖于它的 OS 设施(包括文件系统、计时器、半个网络等)或计划在未来20年更新软件。
在 32 位机器上至少有两个 unix-like 64 位系统 time_t
:OpenBSD 和 NetBSD。 OpenBSD 进行了几次会谈,解释了其背后的原因:http://www.openbsd.org/papers/eurobsdcon_2013_time_t/index.html