Linux应用开发之高精度定时器

linux工具编程之POSIX定时器

前言

POSIX提供了一套定时器API,通过产生一个SIGENENT时间,来通知进程时间产生。
POSIX定时器是一种高精度定时器,其精度可以达到ns级别。POSIX调用librt/libpthread库。
总体框架如下:

❶应用调用库通过系统调用创建Timer,同时自身注册信号处理函数。
❷库提供通用接口,转换成系统调用。
❸内核Timer相关系统调用(setitimer/timer_create),通过hrtimer创建相应的定时器,在超时后调用hrtimer超时函数发送signal给用户空间进程。
❹用户空间进程在收到信号之后,执行对应的信号处理函数。
至此,Timer一个闭环完成。

POSIX定时器API介绍

1.timer_create

int timer_create(clockid_t clockid, struct sigevent *sevp,timer_t *timerid);

@param1 clockid_t clockid 时钟标识符
CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变。
CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响。(常用
CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间。
CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间。

@param2 struct sigevent *sevp 定时器超时通知调用者的超时信息,sigevent 结构如下:

   union sigval {
		    int sival_int;     
		    void *sival_ptr; 
		}; 
		struct sigevent 
		{     
		    int sigev_notify;                    //notification method     
		    int sigev_signo;                    //notification signal     
		    union signal sigev_value;                        //data passed with notification     
		    void (*sigev_notify_function)(union sigval);    //function used for thread
		    pthread_attr_t *sigev_notify_attribute;            //attribute for notification
		};

根据sevp.sigev_notify字段,该字段有如下值:
SIGEV_NONE: 定时器超时后不使用异步通知,可能的情况是使用timer_gettime来监控定时器
SIGEV_SIGNAL: 一旦超时,产生一个信号,任何时候,至多只有一个信号会发送到队列里面,可以使用。
SIGEV_THREAD:指定一个新线程,sigevent ->sigev_notify_function处理超时。(常用)

@param3 timer_t *timerid 返回一个timerIID,该ID对进程唯一。

2.timer_settime

int timer_settime(timer_t timerid, int flags,
                         const struct itimerspec *new_value,
                         struct itimerspec *old_value);

@param1 传入的timer ID.
@param2 如果flags的值为TIMER_ABSTIME,则value所指定的时间值会被解读成绝对值(此值的默认的解读方式为相对于当前的时间)。这个经修改的行为可避免取得当前时间、计算“该时间”与“所期望的未来时间”的相对差额以及启动定时器期间造成竞争条件。
@param3 struct itimerspec *new_value itimerspec 结构体如下:

struct itimerspec {
	struct timespec it_interval;	/* timer period */
	struct timespec it_value;	/* timer expiration */
};

it_interval为0表示定时器只执行一次,定时器超时时间为it_value
@param4 struct itimerspec *old_value ovalue的值不是NULL,则之前的定时器到期时间会被存入其所提供的itimerspec。如果定时器之前处在未启动状态,则此结构的成员全都会被设定成0。

3.timer_gettime(timer_t timerid,struct itimerspec *value)

获得一个活动定时器的剩余时间

4.int timer_delete (timer_t timerid);

删除一个定时器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值