2013-04-04 33 views
0

我正在运行Linux,并有这段代码片断,我想用它来操纵C中的一个定时器,每40ms触发一个函数。到目前为止,我只试图运行创建并启动新计时器的部分。然而,我收到以下错误:在C中初始化定时器

/tmp/ccA7MbyS.o: In function `main': 
server.c:(.text+0x69e): undefined reference to `timer_create' 
server.c:(.text+0x6be): undefined reference to `timer_settime' 
collect2: ld returned 1 exit status 

如果我注释这些方法代码编译罚款。有任何想法吗?

#include <sys/time.h> 
#include <signal.h> 
#include <time.h> 

// This struct is created to save information that will be needed by the timer, 
// such as socket file descriptors, frame numbers and video captures. 
struct send_frame_data { 
    int socket_fd; 
    // other fields 
}; 

// This function will be called when the timer ticks 
void send_frame(union sigval sv_data) { 

    struct send_frame_data *data = (struct send_frame_data *) sv_data.sival_ptr; 
    // You may retrieve information from the caller using data->field_name 
    // ... 
} 

// ... 

// The following snippet is used to create and start a new timer that runs 
// every 40 ms. 
struct send_frame_data data; // Set fields as necessary 
struct sigevent play_event; 
timer_t play_timer; 
struct itimerspec play_interval; 

memset(&play_event, 0, sizeof(play_event)); 
play_event.sigev_notify = SIGEV_THREAD; 
play_event.sigev_value.sival_ptr = &data; 
play_event.sigev_notify_function = send_frame; 

play_interval.it_interval.tv_sec = 0; 
play_interval.it_interval.tv_nsec = 40 * 1000000; // 40 ms in ns 
play_interval.it_value.tv_sec = 0; 
play_interval.it_value.tv_nsec = 1; // can't be zero 

timer_create(CLOCK_REALTIME, &play_event, &play_timer); 
timer_settime(play_timer, 0, &play_interval, NULL); 

// The following snippet is used to stop a currently running timer. The current 
// task is not interrupted, only future tasks are stopped. 
play_interval.it_interval.tv_sec = 0; 
play_interval.it_interval.tv_nsec = 0; 
play_interval.it_value.tv_sec = 0; 
play_interval.it_value.tv_nsec = 0; 
timer_settime(play_timer, 0, &play_interval, NULL); 

// The following line is used to delete a timer. 
timer_delete(play_timer); 

回答

2

我敢肯定,这是因为你很可能不会与实时库(librt)链接:-lrt。在its man-page

的更多信息:

Link with -lrt.

+0

我一直在挣扎整天跟这和解决方案是如此简单,哈哈,感谢的人。 – 2013-04-04 01:05:16

+0

@PatricioJerí适合我们所有人:)很高兴我能提供帮助。 – 2013-04-04 01:05:28

+1

''lrt'记录在'clock_gettime'的'man'页面中......请**阅读'man'页面**(例如在您的终端中键入'man clock_gettime'),它们帮助很大。 – 2013-04-04 05:19:50