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 falseNTP 서비스를 끄곤 했습니다. 이 settimeofday기능은 시스템 시계만 변경할 수 있다는 점에 유의해야 합니다 . 이 date명령은 시스템 시계와 hwclockRTC를 사용합니다. 이는 date명령이 변경 사항을 표시할 수 있지만 hwclock명령은 표시할 수 없음을 의미합니다 .

관련 정보