2009-05-28 5 views
7

J'essaie de déterminer la granularité des minuteurs sur ma machine Linux. Selon les pages de manuel pour clock_getres, je devrais pouvoir utiliser cet extrait:Utilisation de 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); 
    } 
    } 
} 

Je suis en train de construire comme ceci: gcc -o timertest timertest.c

Cela fonctionne très bien sur Solaris mais sur Linux, je reçois l'erreur:

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

J'ai essayé de passer -lc à gcc, clock_getres apparemment est défini dans libc, mais il ne fait aucune différence. Je dois manquer quelque chose de simple ici - des idées?

Merci,

Russ

Répondre

14

Vous devez créer un lien avec avec la bibliothèque RT (-lrt)

+1

Même sous Linux, la page de manuel de clock_getres indique "Link with -lrt." Russ, tu as juste de la chance que Linux soit aussi indulgent que ça. – ephemient

2

Malheureusement, clock_getres() fonction POSIX (partie facultative "en temps réel" - note marque REALTIME à la page Posix http://pubs.opengroup.org/onlinepubs/009695399/functions/clock_getres.html) ne signale pas la granularité des minuteurs sous Linux. Il ne peut renvoyer que deux résultats prédéfinis: 1/HZ pour les horloges basse résolution (où HZ est la valeur de la macro CONFIG_HZ utilisée lors de la configuration du noyau Linux, les valeurs typiques sont 100 300 1000) ou 1 ns pour les horloges haute résolution (hrtimers).

Le fichier linux/include/linux/hrtimer.h dans le noyau a le commentaire sur cette granularité et sur le sens de clock_getres() résultat 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 */ 

Ainsi, même si la source de temporisation est enregistrée comme « hrtimer » (minuterie haute résolution), il peut ne pas synchroniser toutes les nanosecondes (ns). Et la valeur renvoyée par clock_getres() indiquera seulement que cette minuterie n'a pas été arrondie (parce que timespec struct a une précision de l'ordre de la nanoseconde).

Sous Linux, l'API POSIX est souvent implémentée par glibc (ou ses dérivées comme eglibc), qui sont par défaut liés à tous les programmes (option -lc de l'éditeur de liens). Glibc avec des versions inférieures à 2.17 a séparé certaines parties optionnelles de POSIX dans des bibliothèques supplémentaires, par exemple, -lpthread ou -lrt. clock_getres() a été défini dans -lrt.

l'option -lrt est pas nécessaire pour glibc 2.17 et plus récent, selon la page de manuel Linux des fonctions clock_getres() et clock_gettime(), http://man7.org/linux/man-pages/man2/clock_gettime.2.html

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

Le changement a également été enregistré dans le suivi de la compatibilité: 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