⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer1.c

📁 As you have learnt that sleep( )/usleep()/nanosleep() are not good to delay a process. Timers can pr
💻 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 + -