概述
linux应用编程工具篇
- linux工具编程之POSIX定时器
- 前言
- POSIX定时器API介绍
- 1.timer_create
- 2.timer_settime
- 3.timer_gettime(timer_t timerid,struct itimerspec *value)
- 4.int timer_delete (timer_t timerid);
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);
删除一个定时器
最后
以上就是健康毛衣为你收集整理的Linux应用开发之高精度定时器linux工具编程之POSIX定时器的全部内容,希望文章能够帮你解决Linux应用开发之高精度定时器linux工具编程之POSIX定时器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复