#include<stdio.h>#include<signal.h>voidtimer(intsig){if(SIGALRM==sig){printf("timer\n");alarm(1);//we contimue set the timer}return;}intmain(){signal(SIGALRM,timer);//relate the signal and functionalarm(1);//trigger the timergetchar();return0;}
/*gcc main.c -lrt*/#include<stdlib.h>#include<unistd.h>#include<stdio.h>#include<signal.h>#include<time.h>#define errExit(msg) \ do \ { \ perror(msg); \ exit(EXIT_FAILURE); \ } while (0)voidtimer_handler(){time_tt;time(&t);printf("\n current time is : %s",ctime(&t));return;}intmain(intargc,char*argv[]){timer_ttimerid;structsigeventsev;structitimerspecits;sev.sigev_notify=SIGEV_SIGNAL;sev.sigev_signo=SIGUSR1;sev.sigev_value.sival_ptr=&timerid;signal(SIGUSR1,timer_handler);if(timer_create(CLOCK_MONOTONIC,&sev,&timerid)==-1){errExit("timer_create");}its.it_value.tv_sec=1;its.it_value.tv_nsec=0;its.it_interval.tv_sec=0;its.it_interval.tv_nsec=500000000;/* 啓動定時器 */if(timer_settime(timerid,0,&its,NULL)==-1){errExit("timer_settime");}while(1){;//sleep(1);}timer_delete(timerid);exit(EXIT_SUCCESS);}
// https://hackmd.io/@sysprog/linux-timerfd#include<sys/timerfd.h>#include<time.h>#include<unistd.h>#include<stdlib.h>#include<stdio.h>#include<stdint.h> /* Definition of uint64_t */#define handle_error(msg) \ do \ { \ perror(msg); \ exit(EXIT_FAILURE); \ } while (0)staticvoidprint_elapsed_time(void){staticstructtimespecstart;structtimespeccurr;staticintfirst_call=1;intsecs,nsecs;if(first_call){first_call=0;if(clock_gettime(CLOCK_MONOTONIC,&start)==-1){handle_error("clock_gettime");}}if(clock_gettime(CLOCK_MONOTONIC,&curr)==-1){handle_error("clock_gettime");}secs=curr.tv_sec-start.tv_sec;nsecs=curr.tv_nsec-start.tv_nsec;if(nsecs<0){secs--;nsecs+=1000000000;}printf("%d.%03d: ",secs,(nsecs+500000)/1000000);}intmain(intargc,char*argv[]){structitimerspecnew_value;intmax_exp,fd;structtimespecnow;uint64_texp,tot_exp;ssize_ts;if((argc!=2)&&(argc!=4)){fprintf(stderr,"%s init-secs [interval-secs max-exp]\n",argv[0]);exit(EXIT_FAILURE);}if(clock_gettime(CLOCK_REALTIME,&now)==-1){handle_error("clock_gettime");}/* Create a CLOCK_REALTIME absolute timer with initial expiration and interval as specified in command line */new_value.it_value.tv_sec=now.tv_sec+atoi(argv[1]);new_value.it_value.tv_nsec=now.tv_nsec;if(argc==2){new_value.it_interval.tv_sec=0;max_exp=1;}else{new_value.it_interval.tv_sec=atoi(argv[2]);max_exp=atoi(argv[3]);}new_value.it_interval.tv_nsec=0;fd=timerfd_create(CLOCK_REALTIME,0);if(fd==-1){handle_error("timerfd_create");}if(timerfd_settime(fd,TFD_TIMER_ABSTIME,&new_value,NULL)==-1){handle_error("timerfd_settime");}print_elapsed_time();printf("timer started\n");for(tot_exp=0;tot_exp<max_exp;){s=read(fd,&exp,sizeof(uint64_t));if(s!=sizeof(uint64_t)){handle_error("read");}tot_exp+=exp;print_elapsed_time();printf("read: %llu; total=%llu\n",(unsignedlonglong)exp,(unsignedlonglong)tot_exp);}exit(EXIT_SUCCESS);}