c語言寫的定時器
【實現功能】:下的C程式設計:編寫一個程式(庫),實現定時器(計時器)的功能,它能為使用者提供在同一程序中多次使用的定時器。這裡要求用訊號來實現。
【解題思路】:編寫一個結構體Timer代表一個計時器,然後再定義Timer型別的陣列myTimer[N],用來儲存我們設定的定時器;再定義函式setTimer()生成計時器,並將生成的計時器儲存到myTimer中,這樣通過多次呼叫,就可以在同一個程序中生成多個計時器;定義timeout()訊號處理函式,每隔一秒產生一個訊號,通過呼叫timeout()對所有的定時器掃描一遍,檢查哪些計時器超時。
【程式程式碼】:如下
#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
case1:
printf("------Timer 1: --Hello Aillo!\n");break;
case2:
printf("------Timer 2: --Hello Jackie!\n");break;
case3:
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);
}