2009-05-28 16 views
7

私はLinuxのボックスでタイマーの細かさを判断しようとしています。clock_getres - newbieの使用Linux C

#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); 
    } 
    } 
} 

私はそうのように構築しようとしている:clock_getresのmanページによると、私はこのスニペットを使用することができるはずです の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 

私はどうやらclock_getres、GCCに-lcを渡して試してみたがlibcの中で定義されているが、それは違いはありません。私はここで何か簡単なものを見逃しているに違いない - どんな考え?

おかげで、

ラス

答えて

14

あなたは

+1

Linuxの場合でも、clock_getresのマンページでは、「Link with -lrt」と表示されます。 Russ、あなたはLinuxがそのまま許してくれるのは幸いです。 – ephemient

2

残念ながら、clock_getres() POSIX機能(オプションの "リアルタイム" の部分は、(-lrt)RTライブラリとをリンクする必要がある - POSIXページでREALTIMEマークに注意してくださいhttp://pubs.opengroup.org/onlinepubs/009695399/functions/clock_getres.html)はLinuxでタイマー粒度を報告しません。低分解能クロックの場合は1/HZ(Linuxカーネルの設定時に使用されるCONFIG_HZマクロの値で、標準値は100 300 1000)または高分解能クロック(hrtimers)の場合は1 nsの2つの定義済みの結果のみを返すことができます。カーネル内

ファイル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」(高分解能タイマー)として登録されている場合でも、それはすべてのナノ秒(ns)を計時するわけではありません。 clock_getres()から返された値は、このタイマーが丸められていないとしか言​​いません(timespec構造体にはナノ秒精度があるため)。

Linuxでは、POSIX APIは、デフォルトですべてのプログラム(リンカの-lcオプション)にリンクされているglibc(またはeglibcの派生語)によって実装されることがよくあります。 2.17より小さいバージョンのGlibcは、POSIXのいくつかのオプション部分を別のライブラリに分割しました。例えば、-lpthreadまたは-lrtです。 clock_getres()-lrtで定義されました。 http://upstream.rosalinux.ru/compat_reports/glibc/2.16.0_to_2.17/abi_compat_report.html

Added Symbols ... libc-2.17.so ... clock_getres

-lrtオプションはhttp://man7.org/linux/man-pages/man2/clock_gettime.2.html

Link with -lrt (only for glibc versions before 2.17).

変更はまた、互換性トラッカーに登録して、clock_getres()clock_gettime()機能のLinuxのmanページによると、glibcの2.17およびそれ以降のために必要とされていません

関連する問題