linux下多个定时器的实现(C语言),麻烦高手指点哈嘛(急)

linux下多个定时器的实现(C语言),麻烦高手指点哈嘛(急),第1张

给你两个函数参考

omsTimer函数是处理定时事件,void(*handle)(union sigval v)参数就是处理事件的函数指针。

int omsSetTimer(timer_t *tId,int value,int interval)就是设置定时器

按你说的,如果要同时起多个定时器,需要定义一个数组timer_t tm[n]int it[n]tm就是定时器结构,it用来记录对应的定时器是否已经使用,使用中的就是1,没用的就是0;

主进程消息来了就从it找一个没用的来omsSetTimer,如果收到终止消息,那omsSetTimer 定时时间为0

int omsTimer(timer_t *tId,int iValue,int iSeconds ,void(*handle)(union sigval v),void * param)

{

struct sigevent se

struct itimerspec ts

memset (&se, 0, sizeof (se))

se.sigev_notify = SIGEV_THREAD

se.sigev_notify_function = handle

se.sigev_value.sival_ptr = param

if (timer_create (CLOCK_REALTIME, &se, tId) <0)

{

return -1

}

ts.it_value.tv_sec = iValue

// ts.it_value.tv_sec =3

//ts.it_value.tv_nsec = (long)(iValue % 1000) * (1000000L)

ts.it_value.tv_nsec = 0

ts.it_interval.tv_sec = iSeconds

//ts.it_interval.tv_nsec = (long)(iSeconds % 1000) * (1000000L)

ts.it_interval.tv_nsec = 0

if (timer_settime(*tId, TIMER_ABSTIME, &ts, NULL) <0)

{

return -1

}

return 0

}

int omsSetTimer(timer_t *tId,int value,int interval)

{

struct itimerspec ts

ts.it_value.tv_sec =value

//ts.it_value.tv_nsec = (long)(value % 1000) * (1000000L)

ts.it_value.tv_nsec = 0

ts.it_interval.tv_sec = interval

//ts.it_interval.tv_nsec = (long)(interval % 1000) * (1000000L)

ts.it_interval.tv_nsec = 0

if (timer_settime(*tId, TIMER_ABSTIME, &ts, NULL) <0)

{

return -1

}

return 0

}

 //一个示例程序。

#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=0j<ij++)

    {

       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)

}

可以用alarm信号做:

alarm(设置信号传送闹钟)

相关函数 signal,sleep

表头文件 #include<unistd.h>

定义函数 unsigned int alarm(unsigned int seconds)

函数说明 alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds 为0,则之前设置的闹钟会被取消,并将剩下的时间返回。

返回值返回之前闹钟的剩余秒数,如果之前未设闹钟则返回0。

#include<unistd.h>

#include<signal.h>

void handler() {

//这里读跳变次数

}

main()

{

int i

signal(SIGALRM,handler)//这里设置时钟信号的响应函数

alarm(1)//这里设置每一秒钟发送一个时钟信号

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8748642.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存