中易网

求linux下用c语言编写的定时器程序

答案:2  悬赏:70  
解决时间 2021-01-19 14:51
求linux下用c语言编写的定时器程序
最佳答案
定时器就相当于系统每隔一段时间给进程发一个定时信号。
在linux里面有一种进程中信息传递的方法,那就是信号,定时器程序就是需要定义一个信号处理函数。利用定时器产生的一个信号SIGALRM信号,在收到该信号同时会调用do_alarm函数。这也就类似单片机的定时中断,当定时到了,就跳到中断服务函数里去执行相应的程序。  
Linux操作系统为每一个进程提供了3个内部间隔计时器. 
ITIMER_REAL:减少实际时间.到时的时候发出SIGALRM信号.  
ITIMER_VIRTUAL:减少有效时间(进程执行的时间).产生SIGVTALRM信号.  
ITIMER_PROF:减少进程的有效时间和系统时间(为进程调度用的时间).这个经常和上面一个使用用来计算系统内核时间和用户时间.产生SIGPROF信号. 
代码如下:
#include   
#include   
#include   
#include   
#include   
  
static int count = 0;  
static struct itimerval oldtv;  
  
void set_timer()  
{  
    struct itimerval itv;  
    itv.it_interval.tv_sec = 1;  
    itv.it_interval.tv_usec = 0;  
    itv.it_value.tv_sec = 1;  
    itv.it_value.tv_usec = 0;  
    setitimer(ITIMER_REAL, &itv, &oldtv);  
}  
  
void signal_handler(int m)  
{  
    count ++;  
    printf("%d
", count);  
}  
  
int main()  
{  
    signal(SIGALRM, signal_handler);  
    set_timer();  
    while(count < 10000);  
    exit(0);  
    return 1;  
}
全部回答
 //一个示例程序。
#include
#include
#include
#include
#include
#define N 100 //设置最大的定时器个数
int i=0,t=1; //i代表定时器的个数;t表示时间,逐秒递增
 
struct Timer //Timer结构体,用来保存一个定时器的信息
{
    int total_time; //每隔total_time秒
    int left_time; //还剩left_time秒
    int func; //该定时器超时,要执行的代码的标志
}myTimer[N]; //定义Timer类型的数组,用来保存所有的定时器
 
void setTimer(int t,int f) //新建一个计时器
{
    struct Timer a;
    a.total_time=t;
    a.left_time=t;
    a.func=f;
    myTimer[i++]=a;
}
 
void timeout() //判断定时器是否超时,以及超时时所要执行的动作
{
    printf("Time: %d ",t++);
    int j;
    for(j=0;j    {
       if(myTimer[j].left_time!=0)
           myTimer[j].left_time--;
       else
       {
           switch(myTimer[j].func)
           {      //通过匹配myTimer[j].func,判断下一步选择哪种操作
           case 1:
              printf("------Timer 1: --Hello Aillo! ");break;
           case 2:
              printf("------Timer 2: --Hello Jackie! ");break;
           case 3:
              printf("------Timer 3: --Hello PiPi! ");break;
           }
           myTimer[j].left_time=myTimer[j].total_time; //循环计时
       }
    }
}
 
int main() //测试函数,定义三个定时器
{
    setTimer(3,1);
    setTimer(4,2);
    setTimer(5,3);
    signal(SIGALRM,timeout); //接到SIGALRM信号,则执行timeout函数
   
    while(1)
    {
       sleep(1); //每隔一秒发送一个SIGALRM
       kill(getpid(),SIGALRM);
    }
    exit(0);
}追问有没有基于链表的?
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
露脚裸的那种袜子叫什么?不是船袜
怎样才能心静如水,心无杂物?
眼生的意思是什么?眼生的释义是什么啊?
西湖玩一圈需要多久
英语翻译首先然后最后怎么说
assistance是什么意思
c++itoa undeclared?? 一个把int转string类型
芙蓉阁女士养生馆地址在什么地方,想过去办事
THEONE街舞钢琴生活馆地址在哪,我要去那里办
为什么那么多人养中华田园犬和田园猫?
如果,有一天上帝眷恋你,赏赐你三样东西,只
求探探王messi截图
歌词 风一样的梦 约我海边走 将海面染红
《花钟》这篇课文描写了自然界什么的现象?
能帮我有李腊梅做一首诗吗?
推荐资讯
葱有没有通奶的作用
一项工程,平均每天完成它的五分之二,几天可
求助懂建筑的热心人
翻滚奔腾的意思是什么
各位烟友?谁知道这烟多钱一盒
先将函数f(x)=sinωx(ω>0)的图像关于x轴对称
求csol2中awp和tgr42的属性对比图
为什么我新开的淘宝店铺最多智能新建3个子账
最让人能睡觉好的歌曲
新人即将入坑,问一下大佬们哪个区人最多大神
求教吧内ps大神
北李庄小学(邯郸复兴区)地址好找么,我有些事
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?