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

📄 timer.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 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 + -