欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux Posix定时器介绍

程序员文章站 2022-06-09 13:09:30
...

linux Posix定时器介绍

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

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

1.timer_create
linux Posix定时器介绍

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

参数 含义
CLOCK_REALTIME Systemwide realtime clock.(系统实时时间,即日历时间)
CLOCK_MONOTONIC Represents monotonic time. Cannot be set.(从系统启动开始到现在为止的时间)
CLOCK_PROCESS_CPUTIME_ID High resolution per-process timer(本进程启动到执行到当前代码,系统CPU花费的时间).
CLOCK_THREAD_CPUTIME_ID Thread-specific timer(本线程启动到执行到当前代码,系统CPU花费的时间).
CLOCK_REALTIME_HR High resolution version of CLOCK_REALTIME(CLOCK_REALTIME的细粒度(高精度)版本).
CLOCK_MONOTONIC_HR High 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
linux Posix定时器介绍
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;

        evp.sigev_value.sival_ptr = &timer;

        //配置定时器,时间一到发送一个SIGUSR1信号,执行信号处理函数
        evp.sigev_notify = SIGEV_SIGNAL;
        evp.sigev_signo = SIGUSR1;
        signal(SIGUSR1, function_timer);

        //创建定时器,时钟选择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

运行结果如下
linux Posix定时器介绍

相关标签: c基础