2009-05-28 10 views
7

Sto provando a determinare la granularità dei timer sulla mia macchina Linux. Secondo le pagine man di clock_getres, dovrei essere in grado di utilizzare questo frammento:Uso di 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); 
    } 
    } 
} 

sto cercando di costruire in questo modo: gcc -o timertest timertest.c

Questa grande opera su Solaris ma su Linux ottengo l'errore:

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

ho provato a passare -lc a gcc, a quanto pare clock_getres è definito in libc, ma non fa alcuna differenza. Devo mancare qualcosa di semplice qui - qualche idea?

Grazie,

Russ

risposta

14

è necessario collegare con con la biblioteca RT (-lrt)

+1

Anche su Linux, la manpage per clock_getres afferma "Collega con -lrt." Russ, sei solo fortunato che Linux sia tanto permissivo quanto lo è. – ephemient

2

Purtroppo, clock_getres() funzione POSIX (optional "in tempo reale" parte - nota REALTIME marchio a pagina POSIX http://pubs.opengroup.org/onlinepubs/009695399/functions/clock_getres.html) non segnala granularità dei timer in Linux. Può restituire solo due risultati predefiniti: 1/HZ per gli orologi a bassa risoluzione (dove HZ è il valore della macro CONFIG_HZ utilizzata durante la configurazione del kernel Linux, i valori tipici sono 100 300 1000) o 1 ns per gli orologi ad alta risoluzione (hrtimers).

Il file linux/include/linux/hrtimer.h nel kernel ha il commento su come granularità e sul significato di clock_getres() risultato 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 */ 

Quindi, anche se la fonte del timer è registrato come "hrtimer" (timer ad alta risoluzione), potrebbe non clock ogni nanosecondo (ns). E il valore restituito da clock_getres() dirà solo che questo timer non è stato arrotondato (perché la struttura timespec ha una precisione di nanosecondi).

In Linux l'API POSIX viene spesso implementata da glibc (o dai suoi derivati ​​come eglibc), che sono collegati a tutti i programmi per impostazione predefinita (opzione -lc di linker). Glibc con versioni inferiori alla 2.17 ha separato alcune parti facoltative di POSIX in librerie aggiuntive, ad esempio -lpthread o -lrt. clock_getres() è stato definito in -lrt. opzione

-lrt non è necessaria per glibc 2.17 e successivi, in base alle pagine man di Linux di clock_getres() e clock_gettime() funzioni, http://man7.org/linux/man-pages/man2/clock_gettime.2.html

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

il cambiamento è stato anche registrato nel tracker 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