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

来源:互联网 发布:通达oa开放那些端口 编辑:程序博客网 时间:2024/05/22 08:00

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

定时器详细描述可参考这位道友的博客文章: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();  
}