linux Posix定时器介绍

linux Posix定时器介绍

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

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

1.timer_create
linux Posix定时器介绍_第1张图片

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定时器介绍_第2张图片
timerid 创建的定时器id
struct itimerspec

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

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

下面是一个实例:

#include
#include
#include
#include

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定时器介绍_第3张图片

你可能感兴趣的:(c基础)