Ubuntu

settimeofday 函式不能改變時間

  • November 11, 2021

在 Ubuntu 20.04 LTS 中,我使用 C 編寫了一個程序來更改系統時間。在程序執行期間,它會使用命令datehwclock輸出修改後的時間。但是當程序結束時,我在控制台中輸入datehwclock,時間沒有變化。我不知道為什麼。這是我的程式碼:

#include <stdio.h>
#include <stdint.h> 
#include <stdlib.h> 
#include <unistd.h>
#include <sys/time.h>

#define BILLION 1000000000L

void TimeSet(int year,int month,int day,int hour,int min,int sec)
{
   struct tm tptr;
   struct timeval tv;
   struct timeval now;

   int res;
   gettimeofday(&now, 0);
   printf("now sec=%ld\n", now.tv_sec);

   tptr.tm_year = year - 1900;
   tptr.tm_mon = month - 1;
   tptr.tm_mday = day;
   tptr.tm_hour = hour;
   tptr.tm_min = min;
   tptr.tm_sec = sec;
   tptr.tm_isdst = -1;

   tv.tv_sec = mktime(&tptr);
   tv.tv_usec = 0;
   
   printf("set sec=%ld\n", tv.tv_sec);
   res = settimeofday(&tv, NULL);
   if(res != 0){
       printf("Set fail\n");
       exit(0);
   }
}

int main(int argc, char **argv)
{
   printf("before time set:");
   fflush(stdout);
   system("date");
   system("hwclock");

   TimeSet(2021,11,9,10,0,0);

   printf("after time set:");
   fflush(stdout);
   system("date");
   system("hwclock");

   return 0;
}

也許我找到了原因。Ubuntu 有兩個時鐘:實時時鐘(RTC,或硬體時鐘)和系統時鐘(或軟體時鐘)。當系統斷電時,RTC 將啟動,由電池供電。當系統啟動時,系統會將系統時鐘與 RTC 同步。但這可能並不准確,如果你設置了一些時間同步服務,比如 NTP,它會校準偏移量。那麼系統只會使用系統時鐘作為時間資源來處理一些事情,比如中斷。

如果您的系統有 NTP 或 SNTP 服務,則更改不起作用。您必須關閉這些服務。您可以使用命令:systemctl status ntpd, systemctl status chronyd, systemctl status systemd-timesyncd檢查您的系統是否安裝了這些服務。我timedatectl set-ntp false用來關閉 NTP 服務。您必須注意,該settimeofday功能只能更改系統時鐘。該date命令使用系統時鐘,並hwclock使用 RTC。這意味著datecommand 可以顯示更改,但hwclockcommand 不能。

引用自:https://unix.stackexchange.com/questions/676990