linux Posix定时器介绍
程序员文章站
2022-06-09 13:09:30
...
linux Posix定时器介绍
在linux应用编程中,定时器的使用是不可或缺的部分,本文介绍下linux posix定时器常用接口使用方法,如果创建一个有效的定时器。
关于函数的使用方法,如果dlinux 服务器装了linux库,直接用man 3 接口查下,以前有相关文章介绍过man 3的使用。
1.timer_create
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
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
运行结果如下