Программирование на Linux C для получения системного времени

1. clock_gettime

#include<time.h>
int clock_gettime(clockid_t clk_id,struct timespec *tp); 
struct timespec
{
    
    
    time_t tv_sec; /* 秒*/
    long tv_nsec; /* 纳秒*/
}

clk_id : CLOCK_BOOTTIME, система времени, в которой в качестве источника времени используется время запуска системы, не зависит от других факторов, время все еще идет, когда компьютер находится в спящем режиме.
CLOCK_REALTIME — это то, что мы называем естественным временем.Поскольку время на компьютере может быть неточным, его можно установить, поэтому могут быть скачки. Все следующие системы времени не могут быть установлены и не будут описаны по отдельности ниже.
Их много, в конце вложения

#include<time.h>
//伪代码
while(1)
{
    
    

    struct timespec now;
    clock_gettime(CLOCK_BOOTTIME, &now);
    long long now_time = now.tv_sec * 1000000000 + now.tv_nsec;
    printf("now:%lld, sec:%lld, nsec:%lld\n", now_time, now.tv_sec, now.tv_nsec);
		usleep(300000);//300ms
    return now_time;
}

Пожалуйста, добавьте описание изображения
В структуре есть только секунды и микросекунды, а старший бит tv_nsec — это бит 100 миллисекунд. Вы можете видеть, что сон в течение 300 миллисекунд будет добавлен к старшему биту tv_nsec. Когда он заполнится, tv_sec введет один бит. Таким образом, миллисекундное время не пропущено.
CLOCK_BOOTTIME можно использовать в качестве точки аудио- и видеокадров, поскольку на него не влияют никакие факторы, и отсчет времени начинается после загрузки.

2.gettimeofday

#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
struct timeval
{
    
    
  __time_t tv_sec;  /* Seconds.  秒*/
  __suseconds_t tv_usec; /* Microseconds.  微秒*/
};
struct timezone
  {
    
    
    int tz_minuteswest;  /* Minutes west of GMT. 和Greenwich时间差了多少分钟 */
    int tz_dsttime;  /* Nonzero if DST is ever in effect. 日光节约时间的状态  */
  };
long long get_time()
{
    
    
struct timeval tv;
gettimeofday(&tv, NULL);
ZlogInfo("second:%ld\n",tv.tv_sec);  //秒
ZlogInfo("millisecond:%ld\n",tv.tv_sec*1000 + tv.tv_usec/1000);  //毫秒
ZlogInfo("microsecond:%ld\n",tv.tv_sec*1000000 + tv.tv_usec);  //微秒
long long temp_time = tv.tv_sec * 1000000 + tv.tv_usec;
return temp_time;
}

Заполните ноль во втором параметре, вы увидите, что у него есть свои миллисекунды, эта функция возвращает время от времени UTC, 1970/1/1, ноль часов. Фактически оно следует за системным временем, то есть если вы вручную измените системное время, или системный NTP автоматически подкорректирует время онлайн, то это время отправит скачок. Поэтому очень неразумно рассматривать его как оч аудио/видео.

приложение:

CLOCK_REALTIME: относительное время системы, считая от UTC 1970-1-1 0:0:0, изменение системного времени изменит полученное значение;
CLOCK_MONOTONIC: абсолютное время системы/монотонное время, от перезапуска системы до настоящего времени, измените системное время Не влияет на него
CLOCK_PROCESS_CPUTIME_ID: время, затраченное от этого процесса на ЦП текущей кодовой системы CLOCK_THREAD_CPUTIME_ID:
время, потраченное от этого потока до ЦП текущей кодовой системы;

CLOCK_REALTIME — это то, что мы называем естественным временем.Поскольку время на компьютере может быть неточным, его можно установить, поэтому могут быть скачки. Все следующие системы времени не могут быть установлены и не будут описаны по отдельности ниже. Хотя CLOCK_REALTIME_ALARM, CLOCK_REALTIME_COARSE и CLOCK_TAI не могут быть установлены сами по себе, на все них влияет настройка CLOCK_REALTIME, и могут произойти скачки.

CLOCK_REALTIME_ALARM, то же самое, что и CLOCK_REALTIME, полезно только тогда, когда установлен таймер. ALARM представляет собой настройку времени. Если система находится в спящем режиме, когда заданное время истекло, она разбудит систему.

CLOCK_REALTIME_COARSE, то же, что и CLOCK_REALTIME, точность невысокая, но сбор происходит быстрее.

CLOCK_TAI — то же самое, что CLOCK_REALTIME, но независимо от проблемы с дополнительной секундой, TAI — это
обратная аббревиатура Международного атомного времени.

CLOCK_MONOTONIC, поскольку предыдущие системы времени могут прийти в норму, в компьютере требуется монотонно возрастающая система времени. Начало времени в этой системе времени не имеет значения. В Linux в качестве начала времени используется момент запуска системы. Когда компьютер находится в спящем режиме, время приостанавливается и может перейти вперед из-за влияние adjtime и NTP.

CLOCK_MONOTONIC_COARSE, как указано выше, но с пониженной точностью и более быстрым доступом.

CLOCK_MONOTONIC_RAW, то же, что CLOCK_MONOTONIC, но не зависит от adjtime и NTP.

CLOCK_BOOTTIME, система времени, в которой в качестве источника времени используется время запуска системы, не зависит от других факторов, и время все еще идет, когда компьютер находится в спящем режиме.

CLOCK_BOOTTIME_ALARM, как указано выше, полезен только тогда, когда установлен таймер. ALARM представляет настройку времени. Если система находится в спящем режиме, когда заданное время истекло, система разбудится.

CLOCK_PROCESS_CPUTIME_ID, где время создания процесса является источником времени, время отсчитывается, когда процесс запущен, и время приостанавливается, когда процесс находится в спящем режиме.

CLOCK_THREAD_CPUTIME_ID, где время создания потока является источником времени, время выполнения потока и время приостановки, когда поток находится в спящем режиме.

Ссылка:
программирование времени на Linux C
для понимания программного и аппаратного обеспечения времени Linux.

Guess you like

Origin blog.csdn.net/weixin_43466192/article/details/132627274