2009-05-28 12 views
7

Estoy tratando de determinar la granularidad de los temporizadores en mi cuadro de Linux. De acuerdo con las páginas del manual para clock_getres, yo debería ser capaz de utilizar este fragmento:Uso 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); 
    } 
    } 
} 

que estoy tratando de construir de este modo: gcc -o timertest timertest.c

Esto funciona muy bien en Solaris pero en Linux me sale el error:

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

he intentado pasar a -lc gcc, al parecer clock_getres se define en libc, pero no hace ninguna diferencia. Debo perderme algo simple aquí, ¿alguna idea?

Gracias,

Russ

Respuesta

14

es necesario enlazar con la biblioteca de RT (-lrt)

+1

Incluso en Linux, la página de manual de clock_getres indica "Enlace con -lrt". Russ, tienes suerte de que Linux sea tan indulgente como es. – ephemient

2

Desafortunadamente, clock_getres() función POSIX (opcional "en tiempo real" parte - en cuenta TIEMPO REAL marca en la página POSIX http://pubs.opengroup.org/onlinepubs/009695399/functions/clock_getres.html) no informa la granularidad de los temporizadores en Linux. Puede devolver solo dos resultados predefinidos: 1/HZ para relojes de baja resolución (donde HZ es el valor de la macro CONFIG_HZ utilizada al configurar kernel de Linux, los valores típicos son 100 300 1000) o 1 ns para relojes de alta resolución (hrtimers).

El archivo linux/include/linux/hrtimer.h en el kernel tiene el comentario acerca de tales granularidad y significado de clock_getres() resultado 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 */ 

Por lo tanto, incluso si la fuente temporizador está registrada como "hrtimer" (temporizador de alta resolución), puede relojes no cada nanosegundo (ns). Y el valor devuelto por clock_getres() solo dirá que este temporizador no fue redondeado (porque la estructura timespec tiene una precisión de nanosegundos).

En Linux, la API POSIX a menudo es implementada por glibc (o sus derivados como eglibc), que están vinculados a todos los programas por defecto (opción -lc del enlazador). Glibc con versiones menores que 2.17 separó algunas partes opcionales de POSIX en bibliotecas adicionales, por ejemplo, -lpthread o -lrt. clock_getres() se definió en -lrt. opción

-lrt no se necesita para glibc 2.17 y posteriores, de acuerdo con la página de manual de Linux de clock_getres() y clock_gettime() funciones, http://man7.org/linux/man-pages/man2/clock_gettime.2.html

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

El cambio también se registró en el seguimiento de compatibilidad de: 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