Как программно установить аппаратные часы в Linux?

Linux предоставляет вызов stime (2) для установки системного времени. Однако, хотя при этом обновляется системное время, аппаратные часы BIOS не устанавливаются в соответствии с новым системным временем.

Системы Linux обычно синхронизируют аппаратные часы с системным временем при завершении работы и через определенные промежутки времени. Однако, если машина будет выключена и снова выключена до одной из этих автоматических синхронизаций, время будет неправильным при перезапуске машины.

Как обеспечить обновление аппаратных часов при установке системного времени?

Укажите язык программирования.

Lightness Races in Orbit 13.01.2015 14:05

Почему язык программирования имеет значение? У вас разные ответы на разные языки /

Kristopher Johnson 14.01.2015 04:41

Э ................. да.

Lightness Races in Orbit 14.01.2015 08:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
3
25 508
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

После вызова stime () сделайте следующее:

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

См. Справочную страницу hwclock (8) для получения дополнительной информации.

Обратите внимание, что если ваш rtc настроен на использование времени UTC, в противном случае вам нужно добавить --utc или --localtime.

Julien Hirel 22.08.2013 19:23

Я также хотел бы отметить, что аппаратные часы точны только до определенной точки (я видел системы, которые теряют / набирают пару секунд в день).

Думали ли вы о настройке демона сетевого времени для синхронизации ваших часов с сервером времени?

По общему признанию, эта синхронизация не происходит до тех пор, пока демон не запустится, поэтому синхронизация ваших аппаратных часов также помогает между включением питания и моментом, когда демон времени синхронизируется с сервером времени.

По моему опыту, большинство этих вариаций связано с низким напряжением батареи материнской платы. Я бы посоветовал проверить это перед настройкой ненужной службы, если это не критично.

Manuel Ferreria 22.10.2008 22:05

Я бы начал с чтения исходного кода hwclock.

Возможно, вы пишете для встроенной системы, и у вас нет места для другой программы. Или, может быть, вы просто хотите узнать это из любопытства.

Zan Lynx 14.10.2008 22:01

Это был ответ на исходный вопрос. Не знаю, зачем это нужно.

iny 14.10.2008 22:02

@iny, я имел в виду "Зачем читать исходник в hwclock, если можно просто вызвать hwclock?" У Зана был хороший ответ на это.

Kristopher Johnson 14.10.2008 22:05

Запуск "strace hwclock", вероятно, самый быстрый способ удовлетворить свое любопытство.

sigjuice 19.03.2009 11:35
Ответ принят как подходящий

За подробностями обращайтесь к странице руководства 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);

Корень не требуется, только возможность CAP_SYS_TIME согласно rtc (4).

Erikw 12.11.2014 10:11

Если текстовый редактор отличается от kubuntu (по умолчанию в редакторе используется kate), используйте свой собственный с командой sudo в терминале.

  1. запустить терминал
  2. скопируйте и вставьте эту команду sudo kate /etc/default/rcS пресс Enter
  3. введите пароль пользователя (ваш пароль для входа) нажмите Enter
  4. текстовый редактор откроется на рабочем столе
  5. измените строку UTC=yes на UTC=no
  6. и нажмите "Сохранить" (вверху панели вкладок текстового редактора)
  7. перезагрузка

Кажется, не имеет отношения к заданному вопросу.

cosimo193 17.11.2020 20:21

Другие вопросы по теме