settimeofday 函数无法更改时间

settimeofday 函数无法更改时间

在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命令不能。

相关内容