在Ubuntu 20.04 LTS中,我使用C编写了一个程序来更改系统时间。程序执行过程中,确实使用命令输出修改时间日期和硬件时钟。但是当程序结束时,我输入日期或者硬件时钟在控制台中,时间没有变化。我不知道为什么。这是我的代码:
#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;
}
答案1
也许我已经找到原因了。 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
命令可以显示更改,但hwclock
命令不能。