Linux中定时器的使用

一、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;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值