Я переношу проект C из Solaris в Linux и перекомпилирую его. В файле logger.c функция gethrtime() файла sys/time.h не компилируется для Linux. Как я могу портировать его на Linux? Есть ли замена этому в Linux?
Как перенести gethrtime() в C с Solaris на RHEL
Ответы (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
@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