Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25790
  • 博文数量: 15
  • 博客积分: 730
  • 博客等级: 军士长
  • 技术积分: 120
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-16 11:38
文章分类
文章存档

2009年(7)

2008年(8)

我的朋友

分类: LINUX

2008-10-10 14:30:22

实现功能】:下的C编程:编写一个程序(库),实现定时器(计时器)的功能,它能为用户提供在同一进程中多次使用的定时器。这里要求用信号来实现
解题思路】: 编写一个结构体Timer代表一个计时器,然后再定义Timer类型的数组myTimer[N],用来保存我们设置的定时器;再定义函数 setTimer()生成计时器,并将生成的计时器保存到myTimer中,这样通过多次调用,就可以在同一个进程中生成多个计时器;定义 timeout()信号处理函数,每隔一秒产生一个信号,通过调用timeout()对所有的定时器扫描一遍,检查哪些计时器超时。
程序代码】:如下
#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\n",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!\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);
}
阅读(665) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~