8 Stimmen

Verwendung von clock_getres - Neuling Linux C

Ich versuche, die Granularität der Timer auf meiner Linux-Box zu bestimmen. Laut den Man Pages für clock_getres sollte ich dieses Snippet verwenden können:

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

Ich versuche, so zu bauen: gcc -o timertest timertest.c

Unter Solaris funktioniert das prima, aber unter Linux bekomme ich den Fehler:

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

Ich habe versucht, Übergabe -lc zu gcc, anscheinend clock_getres ist in libc definiert, aber es macht keinen Unterschied. Ich muss hier etwas einfaches übersehen - irgendwelche Ideen?

Danke,

Russ

15voto

Nikolai Fetissov Punkte 79627

Sie müssen sich mit der RT-Bibliothek ( -lrt )

5voto

osgx Punkte 85299

Leider, clock_getres() POSIX-Funktion (optionaler "Echtzeit"-Teil - Hinweis REALTIME Markierung auf der POSIX-Seite http://pubs.opengroup.org/onlinepubs/009695399/functions/clock_getres.html ) meldet unter Linux keine Granularität der Zeitgeber. Es kann nur zwei vordefinierte Ergebnisse zurückgeben: entweder 1/HZ für Uhren mit niedriger Auflösung (wobei HZ der Wert des CONFIG_HZ-Makros ist, das bei der Konfiguration des Linux-Kernels verwendet wird, typische Werte sind 100 300 1000) oder 1 ns für Uhren mit hoher Auflösung (hrtimers).

Die Datei linux/include/linux/hrtimer.h im Kernel hat den Kommentar über solche Granularität und über die Bedeutung von clock_getres() Ergebnis 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  */

Selbst wenn die Zeitgeberquelle als "hrtimer" (hochauflösender Zeitgeber) registriert ist, kann es sein, dass sie nicht jede Nanosekunde (ns) taktet. Und der Wert, der von clock_getres() sagt nur, dass dieser Timer nicht gerundet wurde (weil timespec Struktur hat eine Genauigkeit im Nanosekundenbereich).

Unter Linux wird die POSIX-API häufig von der glibc (oder ihren Derivaten wie eglibc) implementiert, die standardmäßig mit allen Programmen verlinkt sind ( -lc Option des Linkers). Glibc mit Versionen kleiner als 2.17 trennte einige optionale Teile von POSIX in zusätzliche Bibliotheken auf, zum Beispiel, -lpthread o -lrt . clock_getres() wurde definiert in -lrt .

-lrt Option wird für die Glibc 2.17 und neuer nicht benötigt, laut der Linux-Manpage von clock_getres() y clock_gettime() Funktionen, http://man7.org/linux/man-pages/man2/clock_gettime.2.html

Linken mit -lrt (nur für Glibc-Versionen vor 2.17).

Die Änderung wurde auch in den Kompatibilitäts-Tracker eingetragen: http://upstream.rosalinux.ru/compat_reports/glibc/2.16.0_to_2.17/abi_compat_report.html

Symbole hinzugefügt ... libc-2.17.so ... clock_getres

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X