Использование clock_getres - новичок в Linux C - PullRequest
8 голосов
/ 28 мая 2009

Я пытаюсь определить гранулярность таймеров на моем компьютере с Linux. Согласно справочным страницам для clock_getres, я должен иметь возможность использовать этот фрагмент:

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

int main( int argc, char** argv )
{
  clockid_t types[] = { CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID, (clockid_t) - 1 };

  struct timespec spec;
  int i = 0;
  for ( i; types[i] != (clockid_t) - 1; i++ )
  {
    if ( clock_getres( types[i], &spec ) != 0 )
    {
      printf( "Timer %d not supported.\n", types[i] );
    }
    else
    {
      printf( "Timer: %d, Seconds: %ld Nanos: %ld\n", i, spec.tv_sec, spec.tv_nsec );
    }
  }
}

Я пытаюсь построить так: gcc -o timertest timertest.c

Это прекрасно работает в Solaris, но в Linux я получаю сообщение об ошибке:

/tmp/ccuqfrCK.o: In function `main':
timertest.c:(.text+0x49): undefined reference to `clock_getres'
collect2: ld returned 1 exit status

Я пытался передать -lc в gcc, по-видимому, clock_getres определен в libc, но это не имеет значения. Я, должно быть, здесь упускаю что-то простое - есть идеи?

Спасибо

Russ

Ответы [ 2 ]

14 голосов
/ 28 мая 2009

Вам необходимо связаться с библиотекой RT (-lrt)

4 голосов
/ 23 апреля 2014

К сожалению, clock_getres() функция POSIX (необязательная часть «в реальном времени» - примечание REALTIME отметка на странице POSIX http://pubs.opengroup.org/onlinepubs/009695399/functions/clock_getres.html) не сообщает о гранулярности таймеров в Linux. Может возвращать только два предварительно определенных результата : либо 1 / HZ для часов низкого разрешения (где HZ - значение макроса CONFIG_HZ, используемого при настройке ядра Linux, типичные значения - 100 300 1000), либо 1 нс для часов высокого разрешения (hrtimers).

Файл linux/include/linux/hrtimer.h в ядре имеет комментарий о такой гранулярности и о значении clock_getres() результата http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/hrtimer.h

269 /*
270  * The resolution of the clocks. The resolution value is returned in
271  * the clock_getres() system call to give application programmers an
272  * idea of the (in)accuracy of timers. Timer values are rounded up to
273  * this resolution values.
274  */

Таким образом, даже если источник таймера зарегистрирован как «hrtimer» (таймер высокого разрешения), он может тактировать не каждую наносекунду (нс). И значение, возвращаемое из clock_getres(), скажет только, что этот таймер не был округлен (поскольку структура timespec имеет наносекундную точность).

В Linux API POSIX часто реализуется с помощью glibc (или его производных, таких как eglibc), которые по умолчанию связаны со всеми программами (опция компоновщика -lc). Glibc с версиями ниже 2.17 разделил некоторые необязательные части POSIX на дополнительные библиотеки, например, -lpthread или -lrt. clock_getres() был определен в -lrt.

Опция

-lrt не требуется для glibc 2.17 и новее, согласно справочной странице Linux по функциям clock_getres() и clock_gettime(), http://man7.org/linux/man-pages/man2/clock_gettime.2.html

Ссылка с -lrt (только для версий glibc до 2.17).

Изменение также было зарегистрировано в трекере совместимости: http://upstream.rosalinux.ru/compat_reports/glibc/2.16.0_to_2.17/abi_compat_report.html

Добавлены символы ... libc-2.17.so ... clock_getres

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...