我正在尝试确定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,但它没有任何区别。我必须在这里遗漏一些简单的东西 - 任何想法?
谢谢,
拉斯
答案 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
或-lrt
。 clock_getres()
中定义了-lrt
。
-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