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

在linux环境下基于链表和信号来实现定时器用间隔定时器setitimer给个主程序也行因为是初学,实在不知道如何下手求个参考拜托了!!!!... 在linux环境下基于链表和信号来实现定时器
用间隔定时器setitimer

给个主程序也行
因为是初学,实在不知道如何下手
求个参考
拜托了!!!!
展开
 我来答
匿名用户
2015-02-06
展开全部
 //一个示例程序。
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<time.h>
#include<sys/time.h>
#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\n",t++);
    int j;
    for(j=0;j<i;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!\n");break;
           case 2:
              printf("------Timer 2: --Hello Jackie!\n");break;
           case 3:
              printf("------Timer 3: --Hello PiPi!\n");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);
}
追问
有没有基于链表的?
jiaxin8000xxsc
2017-08-14 · TA获得超过3.6万个赞
知道大有可为答主
回答量:4009
采纳率:88%
帮助的人:939万
展开全部

定时器就相当于系统每隔一段时间给进程发一个定时信号。

在linux里面有一种进程中信息传递的方法,那就是信号,定时器程序就是需要定义一个信号处理函数。利用定时器产生的一个信号SIGALRM信号,在收到该信号同时会调用do_alarm函数。这也就类似单片机的定时中断,当定时到了,就跳到中断服务函数里去执行相应的程序。  

Linux操作系统为每一个进程提供了3个内部间隔计时器. 

ITIMER_REAL:减少实际时间.到时的时候发出SIGALRM信号.  

ITIMER_VIRTUAL:减少有效时间(进程执行的时间).产生SIGVTALRM信号.  

ITIMER_PROF:减少进程的有效时间和系统时间(为进程调度用的时间).这个经常和上面一个使用用来计算系统内核时间和用户时间.产生SIGPROF信号. 

代码如下:

#include <stdio.h>  
#include <time.h>  
#include <sys/time.h>  
#include <stdlib.h>  
#include <signal.h>  
  
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\n", count);  
}  
  
int main()  
{  
    signal(SIGALRM, signal_handler);  
    set_timer();  
    while(count < 10000);  
    exit(0);  
    return 1;  
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式