一、Linux下使用setitimer实现定时器
/*
* Timer.c
*
* Created on: 2021年4月19日
* Author: zdp
* gcc Timer.c -o Timer
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <signal.h>
#include <stdbool.h>
#include <assert.h>
#define INTERVAL 10000 // 10ms
#define DEBUG 1
#if DEBUG
#define LOG(...) printf(__VA_ARGS__)
#else
#define LOG(...)
#endif
void SignalHandler(int signo)
{
switch (signo) {
case SIGALRM:
LOG("SIGALRM timing time\n");
break;
case SIGINT: // terminal ctrl+c
LOG("SIGINT quit\n");
exit(0);
break;
case SIGTERM: // compiler quit button
LOG("SIGTERM quit\n");
break;
default:
break;
}
}
int StartTimer(){
signal(SIGALRM, SignalHandler);
signal(SIGINT, SignalHandler);
signal(SIGTERM, SignalHandler);
struct itimerval newValue, oldValue;
newValue.it_value.tv_sec = 0;
newValue.it_value.tv_usec = 1;
newValue.it_interval.tv_sec = 0;
newValue.it_interval.tv_usec = INTERVAL;
/*newValue:参数用来对计时器进行设置,it_interval为计时间隔,it_value为延时时长,下面例子中表示的是在setitimer方法调用成功后,延时it_value后触发一次SIGALRM信号,以后每隔it_interval触发一次SIGALRM信号。
settimer工作机制是,先对it_value倒计时,当it_value为零时触发信号,然后重置为it_interval,继续对it_value倒计时,一直这样循环下去。
基于此机制,setitimer既可以用来延时执行,也可定时执行。
假如it_value为0是不会触发信号的,所以要能触发信号,it_value得大于0;如果it_interval为零,只会延时,不会定时(也就是说只会触发一次信号)。
oldValue:参数,通常用不上,设置为NULL,它是用来存储上一次setitimer调用时设置的new_value值。
*/
if(setitimer(ITIMER_REAL, &newValue, &oldValue) < 0){
perror("setitimer() error");
return -1;
}
return 0;
}
int main(){
int ret = StartTimer();
assert(ret == 0);
while(true){
}
return 0;
}
版权声明:本文为weixin_45255749原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。