【问题标题】:Library/code for dynamically reloading the /usr/share/zoneinfo database?用于动态重新加载 /usr/share/zoneinfo 数据库的库/代码?
【发布时间】:2012-08-27 22:49:20
【问题描述】:

由于/usr/share/zoneinfo 系统数据库更新相当频繁,我希望能够在一个运行时间很长的 C++ 程序中动态加载(和重新加载)它。

现在我知道标准库会使用这个数据库,但我怀疑它是否提供动态重新加载(或者至少我在 Google 上找不到任何关于它的信息。)

我可以使用任何 C 或 C++ 库或代码来执行此操作吗?

【问题讨论】:

  • 我能想到的一种非常丑陋的方法是调用一个外部进程,该进程通过 C 标准库加载时区数据,然后对其进行序列化并通过管道将其发送到父进程。不过,我不想这样做。
  • 你总是可以尝试通过下载标准库的源代码来查找,并检查时区函数,看它是每次加载数据库还是缓存它。
  • @JoachimPileborg 任何不缓存它的标准库都应该被打耳光。每次调用 localtime() 时查找、读取和解析这些 zoneinfo 文件对于许多应用程序来说都非常慢。

标签: c++ c linux timezone zoneinfo


【解决方案1】:

我是个白痴。提供 zoneinfo 数据库的 IANA 也提供了a library 用于使用它。有趣的是,我通过阅读 postgresql 源代码发现了这一点。

我不确定这是否足够,但它是公共领域许可的,所以至少我可以将它放入我的代码中并根据我的需要进行调整。

【讨论】:

  • 它需要大量的弯曲,我称之为参考实现,而不是库。
【解决方案2】:

localtime 等人使用tzset 设置的时区转换信息,因此您通常可以通过将TZ 设置为某个值、调用tzset、将其设置回并调用它来重新加载该信息再次。这适用于 glibc,但您可能应该在其他平台上进行检查。

否则,您正在使用其他一些非 Posix API 来访问 zoneinfo 数据库,您应该查看该库用于重新加载其数据的工具。

【讨论】:

  • 我需要一些非 Posix API,因为我需要安全的多线程访问它。这意味着将数据重新加载到单独的内存中,然后将指针从旧数据交换到新数据。在单线程环境中,您的方法将是理想的。
猜你喜欢
  • 1970-01-01
  • 2019-07-08
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2014-07-28
相关资源
最近更新 更多