Вопрос:
Я занимаюсь разработкой кросс-платформенного приложения, которое меняет системную дату и время на указанное значение. Я выполнил часть для Windows.
Как установить системную дату и время из программы C++ в Linux? Я ищу функцию, похожую на SetSystemTime(SYSTEMTIME &x).
Насколько я понял settimeofday() ничего не делает с датой, и я не уверен в использовании функции stime(). Надеюсь, что mktime() не имеет ничего общего с моей потребностью.
Кто-нибудь может мне помочь.
Лучший ответ:
Вы неправильно поняли. settimeofday (2) устанавливает время эпохи. это и дата и время. Время чтения (7)
Таким образом, если вы начинаете со строки, выражающей дату, преобразуйте эту строку с помощью strptime (3) в struct tm затем преобразуйте ее во время Unix с помощью mktime (3), а затем settimeofday в settimeofday (т. tv_sec Поле tv_sec).
Однако для settimeofday требуются права суперпользователя, и я считаю, что обычно вам следует избегать их вызова (по крайней мере, на обычных компьютерах, подключенных к Интернету). Лучше установите на клиентском ПК какой-нибудь клиентский сервис NTP (например, запустите ntpd или chrony и, в более общем случае, прочитайте главу sysadmin о времени работы…) Смотрите также adjtimex (2)
Кстати, резкое изменение системного времени в многозадачной системе -like Linux или Windows- – очень опасная операция (так как она может расстроить и нарушить многие системные задачи в зависимости или использования времени). Есть несколько веских причин для этого (это очень плохая идея в целом). Если вы сделаете это, сделайте это с очень небольшим количеством запущенных программ и служб (например, однопользовательский режим Linux). Вы не должны делать это в обычном коде приложения.
Ответ №1
Я пишу этот кусок кода, чтобы установить Date и Time под Linux.
struct tm time = { 0 }; time.tm_year = Year — 1900; time.tm_mon = Month — 1; time.tm_mday = Day; time.tm_hour = Hour; time.tm_min = Minute; time.tm_sec = Second; if (time.tm_year < 0) time.tm_year = 0; time_t t = mktime(&time); if (t != (time_t) -1) stime(&t);
Обратите внимание, что для stime требуется root привилегия. Надеюсь, это поможет.
Boshen
Ответ №2
@guan Boshen, можете ли вы сказать мне, как запустить “кусок кода для установки даты и времени в Linux”. что вы разместили с правами суперпользователя? используя QT C++