Ubuntu
settimeofday 函式不能改變時間
在 Ubuntu 20.04 LTS 中,我使用 C 編寫了一個程序來更改系統時間。在程序執行期間,它會使用命令date和hwclock輸出修改後的時間。但是當程序結束時,我在控制台中輸入date或hwclock,時間沒有變化。我不知道為什麼。這是我的程式碼:
#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。這意味著date
command 可以顯示更改,但hwclock
command 不能。