Linux定时器

实现定时器,通过itimeval结构体以及函数setitimer产生的信号,系统随之使用signal信号处理函数来处理产生的定时信号,实现定时器

struct itimerval
{
    
    //it_value 表示 定时器的初值,一般是基于这个初值来加或者减
    struct timeval it_interval;

    //it_interval 表示 程序跑到这里后多久启动定时器
    struct timeval it_value;
}
struct timeval 
{
    __time_t tv_sec;
    __suseconds_t tv_usec;
}
//setitime函数原型
int setitimer(__itimer_which_t __which,const struct itimerval* __restirict__new,const struct itimerval* __restrict__old)

setitimer()将value指向结构体设计为计时器的当前值,如果value不是NULL,则返回计时器原值

which的三种状态:

ITIMER_REAL://数值为0,计时器的值实时递减,发送的信号是SIGALRM

ITIMER_VIRTUAL://数值为1,进程执行时递减计时器的值,发送的信号是SIGVTALRM

ITIMER_PROF: //数值为2,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF

信号处理函数signal(SIGALRM,signal_handler)

测试代码:一秒钟输出一次字符串

1 #include <stdio.h>
  2 #include <sys/time.h>
  3 #include <stdlib.h>
  4 #include <unistd.h>
  5 #include <signal.h>
  6 static int i=0;
  7 void signal_handler(int signal){
  8     i++;
  9     if(i==2000){
 10         printf("luzihao hen shuai!\n");
 11         i=0;
 12     }
 13 }
 14
 15
 16 int main(){
 17     struct itimerval itv;
 18     //设定定时时间
 19     itv.it_interval.tv_sec=0;
 20     itv.it_interval.tv_usec=500;
 21     //设定开始时间,启动定时器的时间(这里是 1毫秒 就开始计时
 23     itv.it_value.tv_sec=1;
 24     itv.it_value.tv_usec=0;
 25     //设定定时方式(这里是 定时器实时递减)
 26     if(-1==setitimer(ITIMER_REAL,&itv,NULL)){
 27         perror("setitmer:");
 28         exit(-1);
 29     }
 30     //信号处理函数
 31     signal(SIGALRM,signal_handler);
 32     while(1);
 33
 34     return 0;
 35 }
~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值