source

Linux에서 C에서 현재 시간을 밀리초 단위로 가져오려면 어떻게 해야 합니까?

factcode 2022. 9. 3. 13:13
반응형

Linux에서 C에서 현재 시간을 밀리초 단위로 가져오려면 어떻게 해야 합니까?

Linux에서 현재 시간을 밀리초 단위로 가져오려면 어떻게 해야 합니까?

이것은 POSIX 기능을 사용하여 달성할 수 있습니다.

현재 버전의 POSIX에서는gettimeofday사용되지 않는 마크가 붙어있습니다.이는 향후 버전의 사양에서 삭제될 수 있음을 의미합니다.어플리케이션 라이터는 다음과 같이 사용하는 것을 추천합니다.clock_gettime대신 기능하다gettimeofday.

다음은 사용 방법의 예입니다.clock_gettime:

#define _POSIX_C_SOURCE 200809L

#include <inttypes.h>
#include <math.h>
#include <stdio.h>
#include <time.h>

void print_current_time_with_ms (void)
{
    long            ms; // Milliseconds
    time_t          s;  // Seconds
    struct timespec spec;

    clock_gettime(CLOCK_REALTIME, &spec);

    s  = spec.tv_sec;
    ms = round(spec.tv_nsec / 1.0e6); // Convert nanoseconds to milliseconds
    if (ms > 999) {
        s++;
        ms = 0;
    }

    printf("Current time: %"PRIdMAX".%03ld seconds since the Epoch\n",
           (intmax_t)s, ms);
}

경과시간을 측정하는 것이 목표이며 시스템에서 "단조 클럭" 옵션을 지원하는 경우CLOCK_MONOTONIC대신CLOCK_REALTIME.

현재 타임스탬프를 밀리초 단위로 취득하기 위한 util 함수를 다음에 나타냅니다.

#include <sys/time.h>

long long current_timestamp() {
    struct timeval te; 
    gettimeofday(&te, NULL); // get current time
    long long milliseconds = te.tv_sec*1000LL + te.tv_usec/1000; // calculate milliseconds
    // printf("milliseconds: %lld\n", milliseconds);
    return milliseconds;
}

시간대 정보:

gettimeofday() support를 사용하여 시간대를 지정합니다.NULL은 시간대를 무시하지만 필요에 따라 시간대를 지정할 수 있습니다.


@Update - 시간대

그 이후로는long시간 표현은 시간대 자체와 관련이 없거나 영향을 받지 않으므로 설정tzgettimeofday()의 param은 차이가 없기 때문에 필요하지 않습니다.

그리고, 의 man page에 따르면gettimeofday(), 의 사용방법timezone구조가 구식이기 때문에tz인수는 보통 NULL로 지정해야 합니다.자세한 내용은 man 페이지를 참조하십시오.

다음과 같은 작업을 수행해야 합니다.

struct timeval  tv;
gettimeofday(&tv, NULL);

double time_in_mill = 
         (tv.tv_sec) * 1000 + (tv.tv_usec) / 1000 ; // convert tv_sec & tv_usec to millisecond

C11timespec_get

구현 해상도로 반올림된 최대 나노초까지 반환됩니다.

Ubuntu 15.10에서는 이미 구현되어 있습니다.API는 POSIX와 동일합니다.clock_gettime.

#include <time.h>
struct timespec ts;
timespec_get(&ts, TIME_UTC);
struct timespec {
    time_t   tv_sec;        /* seconds */
    long     tv_nsec;       /* nanoseconds */
};

상세한 것에 대하여는, https://stackoverflow.com/a/36095407/895245 를 참조해 주세요.

Dan Molding의 POSIX 답변에서 파생된 이 답변은 다음과 같습니다.

#include <time.h>
#include <math.h>

long millis(){
    struct timespec _t;
    clock_gettime(CLOCK_REALTIME, &_t);
    return _t.tv_sec*1000 + lround(_t.tv_nsec/1e6);
}

또한 David Guyon이 지적한 바와 같이 -lm으로 컴파일합니다.

이 버전에서는 연산 라이브러리가 필요하지 않으며 clock_gettime()의 반환값을 체크했습니다.

#include <time.h>
#include <stdlib.h>
#include <stdint.h>

/**
 * @return milliseconds
 */
uint64_t get_now_time() {
  struct timespec spec;
  if (clock_gettime(1, &spec) == -1) { /* 1 is CLOCK_MONOTONIC */
    abort();
  }

  return spec.tv_sec * 1000 + spec.tv_nsec / 1e6;
}

초단위와 마이크로초단위로 시간을 가져옵니다.조합하여 밀리초로 반올림하는 것은 연습으로 남습니다.

언급URL : https://stackoverflow.com/questions/3756323/how-to-get-the-current-time-in-milliseconds-from-c-in-linux

반응형