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またはハードウェアクロック)とシステムクロック(またはソフトウェアクロック)の2つの時計があります。システムの電源が切れると、RTCが起動し、バッテリーに電力が供給されます。システムが起動すると、システムはシステムクロックをRTCと同期します。しかし、これは正確ではないかもしれません。一部の時間同期サービス(NTPなど)を設定すると、オフセットが補正されます。その後、システムは、割り込みなどの一部のタスクを処理するための時間リソースとしてのみシステムクロックを使用します。

システムにNTPまたはSNTPサービスがある場合、変更は適用されません。これらのサービスをオフにする必要があります。次のコマンドを使用して、systemctl status ntpd, systemctl status chronyd, systemctl status systemd-timesyncdシステムにこれらのサービスがインストールされていることを確認できます。私はtimedatectl set-ntp falseNTPサービスをオフにしました。このsettimeofday機能はシステムクロックのみを変更できることに注意してください。このdateコマンドはシステムクロックとhwclockRTCを使用します。これはdate、コマンドは変更を表示できますが、hwclockコマンドは表示できないことを意味します。

関連情報