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

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

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);
}

Это то, что у меня есть около 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() У меня нет способа вернуть ошибку, я не видел причин добавлять ее сюда.

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

Другие вопросы по тегам