【问题标题】:How Do You Programmatically Set the Hardware Clock on Linux?如何在 Linux 上以编程方式设置硬件时钟?
【发布时间】:2010-09-17 03:46:39
【问题描述】:

Linux 提供 stime(2) 调用来设置系统时间。但是,虽然这会更新系统时间,但它不会设置 BIOS 硬件时钟以匹配新的系统时间。

Linux 系统通常会在关机时或定期将硬件时钟与系统时间同步。但是,如果机器在这些自动同步之一之前重新启动,则机器重新启动时的时间将不正确。

在设置系统时间时如何确保硬件时钟得到更新?

【问题讨论】:

  • 指定一种编程语言。
  • 为什么编程语言很重要?你对不同的语言有不同的答案吗/
  • 呃........是的。

标签: c linux time clock hwclock


【解决方案1】:

查看 rtc 手册页了解详细信息,但如果您以 root 身份登录,则如下所示:

#include <linux/rtc.h>
#include <sys/ioctl.h>


    struct       rtc_time {
        int         tm_sec;      
        int         tm_min;      
        int         tm_hour;     
        int         tm_mday;     
        int         tm_mon;      
        int         tm_year;     
        int         tm_wday; /* unused */
        int         tm_yday; /* unused */
        int         tm_isdst;/* unused */
    };

int fd;
struct rtc_time rt;
/* set your values here */
fd = open("/dev/rtc", O_RDONLY);
ioctl(fd, RTC_SET_TIME, &rt);
close(fd);

【讨论】:

  • 不需要根,只有根据 rtc(4) 的 CAP_SYS_TIME 能力。
  • 您好,我有 3 个关于答案的问题。 1. 为什么是自己的 rtc_time 而不是来自 rtc.h 的那个 2. O_RDONLY ?那不只是为了阅读吗? 3. 如果我尝试从 ioctl -1 和 errno 22 获得的代码。这是什么意思?
  • @Offler 这个答案并不意味着复制和粘贴即用型解决方案。我包含了这个结构来展示它是如何工作的。实例查看hwclock程序的源代码。
【解决方案2】:

调用 stime() 后,执行以下操作:

system("/sbin/hwclock --systohc");

有关详细信息,请参阅 hwclock(8) 手册页。

【讨论】:

  • 请注意,如果您的 rtc 设置为使用 UTC 时间,则需要添加 --utc--localtime 否则。
【解决方案3】:

我会从阅读 hwclock 的源代码开始。

【讨论】:

  • 您可能正在为嵌入式系统编写代码,但没有空间用于其他程序。或者,也许您只是出于好奇而想知道。
  • 这是对原始问题的回答。我不知道为什么需要它。
  • @iny,我的意思是“当你可以简单地调用 hwclock 时,为什么要读取 hwclock 的源代码?”赞对此有一个很好的答案。
  • 运行“strace hwclock”可能是满足好奇心的最快方法。
【解决方案4】:

我还想指出,硬件时钟只能精确到一个点(我见过的系统每天会丢失/增加几秒钟)。

您是否考虑过设置网络时间守护程序以将您的时钟与时间服务器同步?

诚然,这种同步直到守护程序启动后才会发生,因此保持硬件时钟同步也有助于在开机和时间守护程序与时间服务器同步的点之间。

【讨论】:

  • 根据我的经验,这些变化中的大部分是由于主板电池上的低电压造成的。如果它不是关键任务,我建议在设置必要的服务之前检查它。
【解决方案5】:

如果文本编辑器与 kubuntu 不同(kate 是编辑器中的默认值),请在终端中使用您自己的 sudo 命令。

  1. 运行终端
  2. 复制并粘贴此命令 sudo kate /etc/default/rcSEnter
  3. enter user password(你的登录密码)按Enter
  4. 文本编辑器将在桌面上打开
  5. 将行UTC=yes更改为UTC=no
  6. 然后点击保存(在文本编辑器标签栏的顶部)
  7. 重启

【讨论】:

  • 似乎与所提出的问题无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 2011-01-12
  • 2017-04-27
  • 2016-07-28
相关资源
最近更新 更多