使用clock_getres – 新手Linux C

我试图确定我的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 ); } } } 

我试图build立像这样:gcc -o timertest timertest.c

这在Solaris上很好,但在Linux上,我得到的错误:

 /tmp/ccuqfrCK.o:在函数`main'中:
 timertest.c :(。text + 0x49):未定义引用'clock_getres'
 collect2:ld返回1退出状态

我已经尝试将-lc传递给gcc,显然clock_getres是在libc中定义的,但是没有任何区别。 我必须在这里错过简单的东西 – 任何想法?

谢谢,

拉斯

Solutions Collecting From Web of "使用clock_getres – 新手Linux C"

你需要链接到RT库( -lrt

不幸的是, clock_getres() POSIX函数(可选的“实时”部分 – 注意POSIX页面上的REALTIME标记http://pubs.opengroup.org/onlinepubs/009695399/functions/clock_getres.html )不报告Linux中的定时器粒度。 它只能返回两个预定义的结果:低分辨率时钟的1 / HZ(其中HZ是配置Linux内核时使用的CONFIG_HZ宏的值,典型值为100 300 1000)或高分辨率时钟(hrtimers)为1 ns。

内核中的文件linux/include/linux/hrtimer.h对这样的粒度和关于clock_getres()结果的意义有个注释http://www.cs.fsu.edu/~baker/devices/lxr/http/source/ LINUX /包括/ 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”(高分辨率定时器),它也可能不是每个纳秒(ns)的时钟。 从clock_getres()返回的值只会说这个定时器不是四舍五入的(因为timespec结构精度为纳秒级)。

在Linux中,POSIX API通常由glibc(或eglibc之类的衍生产品)实现,默认链接到所有程序(链接器的-lc选项)。 Glibc的版本小于2.17将POSIX的一些可选部分分隔到附加的库中,例如-lpthread-lrtclock_getres()是在-lrt中定义的。

根据clock_getres()clock_gettime()函数的Linux手册,glibc 2.17和更新版本不需要-lrt选项, -lrt

与-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