📄 timer1.c
字号:
/* file: timer.c
function: show POSIX interval timer and signal handling
compile: gcc -o timer timer.c -lrt
run: ./timer
*/
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <linux/limits.h>
#include <time.h>
#include <signal.h>
int counter, counter_tmp; /* counter value*/
timer_t timer_id;
struct itimerspec interval; /* time_out settings*/
struct itimerspec inter;
struct timespec start, stop; /* start and stop time for the counter*/
void timer_handler( int signo);
void time_drift ( void );
int main(){
sigset_t mask;
struct sigaction sig_act;
struct sigevent evp;
int status;
/* create a relative timer*/
sigemptyset(&mask);
sig_act.sa_handler = timer_handler;
sig_act.sa_flags = 0;
sigemptyset(&sig_act.sa_mask);
sigaction(SIGUSR1, & sig_act, NULL);
/* create a relative timer, using SIGUSR1*/
evp.sigev_signo = SIGUSR1;
evp.sigev_notify = SIGEV_SIGNAL;
status = timer_create(CLOCK_REALTIME, &evp, &timer_id);
if (status == -1) {
fprintf(stderr, "Error in timer_create\n");
exit(1);
}
/* read timer settings */
printf("Enter down-counter value: ");
scanf("%d", & counter);
counter_tmp = counter; /* counter_tmp is counted down*/
//time_out.it_interval = time_out.it_value;
/* record start time*/
clock_gettime( CLOCK_REALTIME, & start);
printf("Enter interval: value:sec nsec: ");
scanf("%d %d", & interval.it_value.tv_sec, &interval.it_value.tv_nsec);
inter.it_value.tv_sec=start.tv_sec+interval.it_value.tv_sec;
inter.it_value.tv_nsec=start.tv_nsec+interval.it_value.tv_nsec;
/* set timers */
status = timer_settime(timer_id, TIMER_ABSTIME, &inter, NULL);
if (status == -1) {
fprintf(stderr, "timer_settime failed \n");
exit(1);
}
/*
* Loop forever.
* press CRTL/C to terminate.
*/
for(;;) pause();
}
/* signal hander for SIGUSR1 generated by relative timer */
void timer_handler( int signo ){
counter_tmp --;
inter.it_value.tv_sec+=interval.it_value.tv_sec;
inter.it_value.tv_nsec+=interval.it_value.tv_nsec;
timer_settime(timer_id, TIMER_ABSTIME, &inter, NULL);
printf("counter: %d\n", counter_tmp);
if (counter_tmp == 0 ){
clock_gettime( CLOCK_REALTIME, &stop);
timer_delete( timer_id );
time_drift( );
printf("press Ctrl-c to terminiate it\n");
}
}
/* compute time drift and print*/
void time_drift (void){
float drift;
drift = stop.tv_sec - start.tv_sec;
drift += (stop.tv_nsec - start.tv_nsec) / 1000000000.0;
printf("stop - start = %f seconds\n", drift);
drift -= counter * (interval.it_value.tv_sec + interval.it_value.tv_nsec/1000000000.0);
printf("time drift: %f seconds\n", drift);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -