2009-05-28 36 views
7

Tôi đang cố gắng xác định mức độ chi tiết của bộ tính giờ trên hộp Linux của mình. Theo các trang người đàn ông cho clock_getres, tôi sẽ có thể sử dụng đoạn mã này:Sử dụng 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); 
    } 
    } 
} 

Tôi đang cố gắng để xây dựng như sau: gcc -o timertest timertest.c

này hoạt động tốt trên Solaris nhưng trên Linux tôi nhận được lỗi:

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

tôi đã thử đi qua -lc để gcc, rõ ràng clock_getres được định nghĩa trong libc, nhưng nó làm cho không có sự khác biệt. Tôi phải thiếu một cái gì đó đơn giản ở đây - bất kỳ ý tưởng?

Cảm ơn,

Russ

Trả lời

14

Bạn cần phải liên kết với với thư viện RT (-lrt)

+1

Ngay cả trên Linux, trang manpage cho các trạng thái clock_getres "Liên kết với -lrt." Russ, bạn thật may mắn khi Linux được tha thứ như vậy. – ephemient

2

Thật không may, clock_getres() POSIX chức năng (tùy chọn "thời gian thực" phần - lưu ý REALTIME dấu trên trang POSIX http://pubs.opengroup.org/onlinepubs/009695399/functions/clock_getres.html) không báo cáo mức độ chi tiết về thời gian trong Linux. Nó có thể trả về chỉ hai kết quả được xác định trước: 1/HZ cho đồng hồ độ phân giải thấp (HZ là giá trị của macro CONFIG_HZ được sử dụng khi cấu hình hạt nhân Linux, giá trị điển hình là 100 300 1000) hoặc 1 ns cho đồng hồ có độ phân giải cao (hrtimers).

File linux/include/linux/hrtimer.h trong kernel có bình luận về chi tiết như thế và về ý nghĩa của clock_getres() kết quả 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 */ 

Vì vậy, ngay cả khi nguồn timer được đăng ký là "hrtimer" (độ phân giải cao timer), nó có thể đồng hồ không phải mọi nano giây (ns). Và giá trị trả lại từ clock_getres() sẽ chỉ cho biết rằng bộ hẹn giờ này không được làm tròn (vì cấu trúc timespec có độ chính xác nano giây).

Trong Linux API POSIX thường được thực hiện bởi glibc (hoặc các dẫn xuất của nó như eglibc), được liên kết với tất cả các chương trình theo mặc định (tùy chọn -lc của trình liên kết). Glibc với các phiên bản nhỏ hơn 2.17 đã tách một số phần tùy chọn của POSIX thành các thư viện bổ sung, ví dụ: -lpthread hoặc -lrt. clock_getres() được xác định trong -lrt.

-lrt tùy chọn không cần thiết cho glibc 2.17 và mới hơn, theo Linux man page của clock_getres()clock_gettime() chức năng, http://man7.org/linux/man-pages/man2/clock_gettime.2.html

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

Sự thay đổi cũng đã được đăng ký trong bộ theo dõi khả năng tương thích: 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