linux posix定时器,linux Posix定时器介绍

linux Posix定时器介绍

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

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

1.timer_create

315b33d58335a453b227d3a004d8d61e.png

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

0d4a2f7557d7d6baff27dd1e8a4af7bd.png

timerid 创建的定时器id

struct itimerspec

struct itimerspec

{

struct timespec it_interval; // 多次启动时间间隔

struct timespec it_value; //创建后多久启动

};

3.timer_delete

简单,这里不多说了

下面是一个实例:

#include#include#include#includevoid 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

运行结果如下

8edc85d6f9501a39de6a5030874eed40.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值