POSIX定时器-线程方式创建定时器

本文通过具体代码示例介绍了如何创建、设置及销毁POSIX定时器。利用C语言中的定时器API实现周期性的任务调度,并展示了如何通过回调函数处理定时器触发的事件。

/**************************************点点滴滴******汇江成海**********************************/

定时器详细描述可参考这位道友的博客文章:http://blog.csdn.net/sukhoi27smk/article/details/8733011

废话不多说,直接上代码

#include <stdio.h>  
#include <signal.h>  
#include <time.h>  
#include <string.h>  
#include <stdlib.h>  
#include <unistd.h>

int tick = 0;
timer_t tm;
union sigval v;
int my_timer_destory(timer_t *tmid);

void my_timer_thread(union sigval sv)
{
    tick++;
    printf("Timer tick:%d %d \n", tick, sv.sival_int);

    if(tick >= 30)
    {
        my_timer_destory(tm);
    }
}

int my_timer_create(void (*timer_fun)(union sigval v), timer_t *tmid)
{
    struct sigevent sevt;
    memset(&sevt, 0, sizeof(sevt));

    sevt.sigev_notify = SIGEV_THREAD;  //定时器到期后会创建一个线程去执行sigev_notify_function函数,执行完后线程退出
    sevt.sigev_notify_function = timer_fun;

    if(timer_create(CLOCK_MONOTONIC, &sevt, tmid) == -1)
    {
        printf("Timer create failed.\n");
        return -1;
    }
    else
        return 0;
}

int my_timer_set(timer_t *tmid)
{
    struct itimerspec itm;
    itm.it_value.tv_sec     = 1;
    itm.it_value.tv_nsec    = 0;   
    itm.it_interval.tv_sec  = 1;
    itm.it_interval.tv_nsec = 0;   

    if(timer_settime(tmid, 0, &itm, NULL) == -1)
    {
        printf("Timer start failed.\n");
        return -1;
    }
    else
        return 0;
}

int my_timer_destory(timer_t *tmid)
{
    if(*tmid == 0)
    {
        return 0;
    }
    else
        return timer_delete(*tmid);
}

void main(void)
{
    my_timer_create(my_timer_thread, &tm);
    my_timer_set(&tm);
    pause();  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值