linux Posix定时器介绍

linux Posix定时器介绍

在linux应用编程中,定时器的使用是不可或缺的部分,本文介绍下linux posix定时器常用接口使用方法,如果创建一个有效的定时器。

关于函数的使用方法,如果dlinux 服务器装了linux库,直接用man 3 接口查下,以前有相关文章介绍过man 3的使用。

1.timer_create
在这里插入图片描述

clockid :定时间基于哪个时间创建

参数含义
CLOCK_REALTIMESystemwide realtime clock.(系统实时时间,即日历时间)
CLOCK_MONOTONICRepresents monotonic time. Cannot be set.(从系统启动开始到现在为止的时间)
CLOCK_PROCESS_CPUTIME_IDHigh resolution per-process timer(本进程启动到执行到当前代码,系统CPU花费的时间).
CLOCK_THREAD_CPUTIME_IDThread-specific timer(本线程启动到执行到当前代码,系统CPU花费的时间).
CLOCK_REALTIME_HRHigh resolution version of CLOCK_REALTIME(CLOCK_REALTIME的细粒度(高精度)版本).
CLOCK_MONOTONIC_HRHigh resolution version of CLOCK_MONOTONIC(CLOCK_MONOTONIC的细粒度版本)

struct sigevent 结构体

struct sigevent
{
    int sigev_notify;   //设置定时器到期后的行为
    int sigev_signo;    //设置产生信号的信号码
    union sigval   sigev_value; //设置产生信号的值
    void (*sigev_notify_function)(union sigval);//定时器到期,从该地址启动一个线程
    pthread_attr_t *sigev_notify_attributes;    //创建线程的属性
}
 
union sigval
{
    int sival_int;  //integer value
    void *sival_ptr; //pointer value
}

2.timer_settime
在这里插入图片描述
timerid 创建的定时器id
struct itimerspec

struct itimerspec
{
    struct timespec it_interval;    // 多次启动时间间隔
    struct timespec it_value;       //创建后多久启动
};
 

3.timer_delete
简单,这里不多说了

下面是一个实例:

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

void function_timer(void)
{
   printf("recv timer signal\n");
}



int main(int argc, const char *argv[])
{
        int ret;
        int i = 0;
        timer_t timer;
        struct sigevent evp;
        struct timespec spec;
        struct itimerspec time_value;
#if 0
        evp.sigev_value.sival_ptr = &timer;

        //配置定时器,时间一到发送一个SIGUSR1信号,执行信号处理函数
        evp.sigev_notify = SIGEV_SIGNAL;
        evp.sigev_signo = SIGUSR1;
        signal(SIGUSR1, function_timer);
#else
	memset(&evp,0,sizeof(struct sigevent));
	evp.sigev_value.sival_int = 222;
	evp.sigev_notify = SIGEV_THREAD;
	evp.sigev_notify_function = function_timer;
#endif
        //创建定时器,时钟选择CLOCK_MONOTONIC,系统时钟的改变不会影响到定时器的执行
        ret = timer_create(CLOCK_MONOTONIC, &evp, &timer);
        if( ret )
                perror("timer_create");

        //配置多久执行一此  每秒执行一次
        time_value.it_interval.tv_sec = 1;
        time_value.it_interval.tv_nsec = 0;
        clock_gettime(CLOCK_MONOTONIC, &spec);
        //配置开启定时器后多久生效 开启后5s生效
        time_value.it_value.tv_sec = spec.tv_sec + 5;     
        time_value.it_value.tv_nsec = spec.tv_nsec + 0;

        //设置开启定时器
        ret = timer_settime(timer, CLOCK_MONOTONIC, &time_value, NULL);
        if( ret )
                perror("timer_settime");

        while(1)
        {
                //打印时间戳
                printf("now running time:%d\n",i++);
                sleep(1);
                if(i == 10)
                {//删除定时器
                    printf("delete timer new\n");
                        timer_delete(timer);
                        break;
                }
        }
        return 0;
}

这里编译注意了,要链接rt库,否则找不到定时器处理函数

gcc posix_timer.c  -o posixtime -lrt

运行结果如下
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值