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

发布网友 发布时间:2022-04-22 16:49

我来回答

2个回答

热心网友 时间:2023-05-26 01:35

 //一个示例程序。
#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);
}

追问有没有基于链表的?

热心网友 时间:2023-05-26 01:35

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

在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;  
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com