📄 timer.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 time_out; /* time_out settings*/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*/ printf("Enter time-out interval: value:sec nsec: "); scanf("%d %d", & time_out.it_value.tv_sec, &time_out.it_value.tv_nsec); time_out.it_interval = time_out.it_value; /* record start time*/ clock_gettime( CLOCK_REALTIME, & start); /* set timers */ status = timer_settime(timer_id, 0, &time_out, 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 --; 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 * (time_out.it_interval.tv_sec + time_out.it_interval.tv_nsec/1000000000.0); printf("time drift: %f seconds\n", drift);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -