взял пример. а он не компиляется. взял другой - а он тоже не компиляется. на все вызовы методов таймера говорит: undefined reference to 'timer_cerate' и т.д.
компиляю g++ pp.cчто я не так делаю?
вот исходник на всякий пожарный.#define _POSIX_C_SOURCE 199506L
#include<unistd.h>
#include<signal.h>
#include<time.h>
#include<stdio.h>#define OUR_CLOCK CLOCK_REALTIME
char *prog_name;
void timer_intr(int sig, siginfo_t *extra, void *cruft)
{
int noverflow;
if(noverflow=timer_getoverrun(*(timer_t *)
extra->si_value.sival_ptr)){
/*timer has overflowed -- error !*/
}
return;
}timer_t mytimer;
main(int argc, char **argv){
int c;
struct itimerspec i;
struct timespec resolution;
struct sigaction sa;
sigset_t allsigs;
struct sigevent timer_event;prog_name=argv[0];
sigemptyset(&sa.sa_mask);
sa.sa_flags=SA_SIGINFO; /*real-time signal*/
sa.sa_sigaction=timer_intr; /*pointer to action*/if(sigaction(SIGRTMIN, &sa, NULL) < 0){
perror("sigaction error");
exit(1);
}
/*
* first determine whether the desired clock exists
*/if (clock_getres(OUR_CLOCK, &resolution) < 0){
perror("clock_getres error");
exit(1);
}printf("clock resolution %d sec %d nsec \n",
resolution.tv_sec, resolution.tv_nsec);/*
* create a timer based upon the CLOCK_REALTIME clock
*/i.it_interval.tv_sec=0;
/* set resolution to one-tenth of the maximum allowed*/i.it_interval.tv_nsec=resolution.tv_nsec*10;
i.it_value=i.it_interval;/*
* this describes the asynchronous notification to be posted
* upon this timer's expiration:
*
* - use signals
* - send SIGRTMIN
* - send extra data consisting of a pointer back to the timer ID
* cannot pass the timer ID itself because we haven't created it
* yet.
*/timer_event.sigev_notify=SIGEV_SIGNAL;
timer_event.sigev_signo= SIGRTMIN;
timer_event.sigev_value.sival_ptr = (void *)&mytimer;if (timer_create(OUR_CLOCK, &timer_event, &mytimer) < 0){
perror("timer create error");
exit(1);
}
/* relative timer, go off at the end of the interval*/if(timer_settime(mytimer, 0 , &i, NULL) < 0){
perror("settimer");
exit(3);
}sigemptyset(&allsigs);
while(1){
sigsuspend(&allsigs);
}
exit(4);
}Помогиииииииитееее!!!
надо подключить librt ключом -lrt
а вообще, найти в какой библиотеке лежат нужные тебе ф-ции, можно например так
for i in /lib/*.so /usr/lib/*.so /usr/local/lib*.so ;do objdump -T $i|grep timer_create && echo $i;done
ок, спасибо.
но почему об этом не пишут ни в доках ни в книжках! в одной доке написано было что надо делать -lposix.
Я вчера с горя заюзал обычный setitimer.
Все равно спасибо, пригодиться.