Как перенести gethrtime() в C с Solaris на RHEL

Я переношу проект C из Solaris в Linux и перекомпилирую его. В файле logger.c функция gethrtime() файла sys/time.h не компилируется для Linux. Как я могу портировать его на Linux? Есть ли замена этому в Linux?


person SwapnilShivhare    schedule 12.03.2018    source источник


Ответы (3)


Вам нужна функция clock_gettime:

struct timespec t;
if (clock_gettime(CLOCK_MONOTONIC, &t) == -1) {
    perror("clock_gettime for CLOCK_MONOTONIC failed");
} else {
    printf("mono clock timestamp: %ld.%09ld\n", t.tv_sec, t.tv_nsec);
}

Аргумент CLOCK_MONOTONIC получает время из неопределенной начальной точки. Это отличается от CLOCK_REALTIME, который получает время настенных часов.

В большинстве реализаций разрешение будет в наносекундах, однако вы можете узнать точное разрешение, вызвав clock_getres:

struct timespec t;
if (clock_getres(CLOCK_MONOTONIC, &t) == -1) {
    perror("clock_getres for CLOCK_MONOTONIC failed");
} else {
    printf("mono clock resolution: %ld.%09ld\n", t.tv_sec, t.tv_nsec);
}
person dbush    schedule 12.03.2018
comment
@SwapnilShivhare Функция clock_getres сообщает вам разрешение часов реального времени, а не самого таймера. Вывод говорит вам, что один тик равен 1 нс. Вам нужно позвонить clock_gettime, чтобы узнать время. - person dbush; 15.03.2018

Это то, что у меня было около 10+ лет:

Заголовочный файл:

#ifdef __linux
typedef uint64_t hrtime_t;
hrtime_t gethrtime( void );
#endif

Исходный код:

#ifdef __linux

hrtime_t gethrtime( void )
{
    struct timespec ts;
    hrtime_t result;

#ifdef CLOCK_MONOTONIC_HR
    clock_gettime( CLOCK_MONOTONIC_HR, &ts );
#else
    clock_gettime( CLOCK_MONOTONIC, &ts );
#endif

    result = 1000000000LL * ( hrtime_t ) ts.tv_sec;
    result += ts.tv_nsec;

    return( result );
}

#endif

Вероятно, у него должна быть какая-то проверка ошибок, но, поскольку gethrtime() не имеет никакого способа вернуть ошибку, я не вижу причин добавлять его сюда.

person Andrew Henle    schedule 12.03.2018

Прочтите time(7). Вероятно, вы захотите использовать clock_gettime(2).

person Basile Starynkevitch    schedule 12.03.2018