Linux 实现定时器中断

参考文章:

linux定时器_车小猿的博客-CSDN博客_linux 定时器

Linux下实现定时器Timer的几种方法_dengjingen的博客-CSDN博客_linux timer

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <signal.h>
#include <sys/time.h>

//事件1
void timeout1(int sig)
{
	time_t times=0;
	printf("tick time:%ld\n", time(&times));	
}

void create_timer_by_signal(void)
{
	static timer_t times;
	struct itimerspec ts;	//用于配置定时器时间
    struct timespec   now;	//获取linux系统时间
	struct sigevent evp;
	evp.sigev_notify            = SIGEV_SIGNAL;
	evp.sigev_signo 			= SIGUSR1;
	evp.sigev_value.sival_ptr	= &times;
    evp.sigev_notify_attributes = NULL;
	timer_create(CLOCK_REALTIME, &evp, &times);
	/*第一次调用后,每次调用间隔时间*/
	ts.it_interval.tv_sec = 0;
	ts.it_interval.tv_nsec = 100000000;  // 1000ns = 1us    1000us = 1ms   1000ms = 1s 
	/*第一次调用时间*/
	ts.it_value.tv_sec = 1;
	ts.it_value.tv_nsec = 0;	
	signal(SIGUSR1, timeout1);
	timer_settime(times, 0, &ts, NULL);	
}

int main()
{
    create_timer_by_signal();
    while(1);
}

#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>

void timeout1(int sig)
{
	time_t times=0;
	printf("tick time:%ld\n", time(&times) );	
}

void tm_timeout(union sigval value)
{
	printf("create time sifval:%X\n", value.sival_int);
}

void create_time_by_thread(void)
{
	static timer_t times;
	struct itimerspec ts;	//用于配置定时器时间  
	struct sigevent evp;
	
	evp.sigev_notify            = SIGEV_THREAD;
    evp.sigev_notify_function   = tm_timeout;
	evp.sigev_value.sival_int   = 0xFEDC;	//传递参数给 tm_timeout函数
    evp.sigev_notify_attributes = NULL;
	
	timer_create(CLOCK_REALTIME, &evp, &times);
	
	if(1)
	{
		//第一次调用后,每次调用间隔时间,若不需要周期性启动定时器可将 下面两个参数设置值为0
		ts.it_interval.tv_sec = 3;
		ts.it_interval.tv_nsec = 0;
		
		//第一次调用时间
		ts.it_value.tv_sec =7;
		ts.it_value.tv_nsec = 0;	
		
		if(0 != timer_settime(times, 0, &ts, NULL))
		{
			printf("create timer to start failed\n");
		}
	}
	else
	{
		struct timespec   now;					//获取linux系统时间 
		clock_gettime(CLOCK_REALTIME, &now);
		ts.it_value.tv_sec =now.tv_sec + 7;
		ts.it_value.tv_nsec = now.tv_nsec + 0;	
		
		if(0 != timer_settime(times, TIMER_ABSTIME, &ts, NULL))		//绝对时间启动定时器
		{
			printf("create timer to start failed\n");
		}
	}
}

void create_timer_by_signal(void)
{
	static timer_t times;
	struct itimerspec ts;	//用于配置定时器时间
    struct timespec   now;	//获取linux系统时间
	struct sigevent evp;
	
	evp.sigev_notify            = SIGEV_SIGNAL;
	evp.sigev_signo 			= SIGUSR1;
	evp.sigev_value.sival_ptr	= &times;
    evp.sigev_notify_attributes = NULL;
	timer_create(CLOCK_REALTIME, &evp, &times);
	
	/*第一次调用后,每次调用间隔时间*/
	ts.it_interval.tv_sec = 3;
	ts.it_interval.tv_nsec = 0;
	
	/*第一次调用时间*/
	ts.it_value.tv_sec =5;
	ts.it_value.tv_nsec = 0;	
	
	signal(SIGUSR1, timeout1);
	
	timer_settime(times, 0, &ts, NULL);	
}

int main(int argc, char *argv[])
{	
	create_time_by_thread();
	create_timer_by_signal();	
	while(1);
	return 0;
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_42475191

谢谢老板

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值