使用clock_getres - 新手Linux C.

时间:2009-05-28 18:35:23

标签: c linux

我正在尝试确定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,显然在libc中定义了clock_getres,但它没有任何区别。我必须在这里遗漏一些简单的东西 - 任何想法?

谢谢,

拉​​斯

2 个答案:

答案 0 :(得分:14)

您需要与RT库(-lrt

链接

答案 1 :(得分:4)

不幸的是,clock_getres() POSIX功能(可选&#34;实时&#34;部分 - 注意 REALTIME 标记在POSIX页面http://pubs.opengroup.org/onlinepubs/009695399/functions/clock_getres.html上)并未报告Linux中的计时器粒度。它只能返回两个预定义的结果:1 / HZ用于低分辨率时钟(其中HZ是配置linux内核时使用的CONFIG_HZ宏的值,典型值是100 300 1000)或1 ns用于高分辨率时钟(hrtimers)。 p>

内核中的文件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  */

因此,即使定时器源注册为&#34; hrtimer&#34; (高分辨率计时器),它可能不是每纳秒(ns)。从clock_getres()返回的值只会说这个计时器没有舍入(因为timespec结构具有纳秒精度)。

在Linux中,POSIX API通常由glibc(或其衍生产品,如eglibc)实现,默认情况下链接到所有程序(链接器的-lc选项)。版本低于2.17的Glibc将POSIX的一些可选部分分离为其他库,例如-lpthread-lrtclock_getres()中定义了-lrt

根据{{​​1}}和-lrt函数的Linux手册页,http://man7.org/linux/man-pages/man2/clock_gettime.2.html

,glibc 2.17及更新版本不需要

clock_getres()选项

  

与-lrt链接(仅适用于2.17之前的glibc版本)。

此更改也在兼容性跟踪器中注册:http://upstream.rosalinux.ru/compat_reports/glibc/2.16.0_to_2.17/abi_compat_report.html

  

添加了符号... libc-2.17.so ... clock_getres