Linux定时器timerfd用法
一、timerfd系列的定时函数
#include <sys/timerfd.h>
int timerfd_create(int clockid, int flags);
int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value);
int timerfd_gettime(int fd, struct itimerspec *curr_value);
① timerfd_create函数创建定时器对象,这个定时器对象与返回值timerfd进行绑定。第一个参数clockid如果指定为 CLOCK_REALTIME 时表示定时器为实时系统时钟,如果指定为CLOCK_MONOTONIC 表示一个相对单调递增的时钟;第二个参数flags可以指定为TFD_NONBLOCK或者 TFD_CLOEXEC。
② timerfd_settime函数可以设置定时器对象,第一个参数就是timerfd_create函数的返回值,第二个参数指定为0时表示启动相对定时器(此时第三个参数new_value.it_value就要指定为相对时间,假如当前时间为8:00,希望定时器在8:10响的话就设置new_value.it_value为10分钟),当指定为TFD_TIMER_ABSTIME表示绝对定时器(第三个参数new_value.it_value要指定为绝对时间,希望定时器在8:10响的话就指定new_value.it_value为8:10)
③ timerfd_gettime函数的第1个参数是timerfd_create函数的返回值,第二个参数curr_value.it_value表示当前时间到第一次触发剩余的时间。
1、 timerfd_create, timerfd_settime 和 read函数举例:首先设置单次触发定时器,就是设置 struct itimerspec new_value 结构体的成员new_value.it_interval.tv_sec 和 new_value.it_interval.tv_nsec 的值为0
启动相对定时器,单次触发时钟,点击展开代码
#define _POSIX_C_SOURCE 199309L
#include <sys/timerfd.h>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
int main(void)
{
uint64_t exp = 0;
int timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK);
if (timerfd == -1)
{
handle_error("timerfd_create");
}
struct itimerspec new_value = {};
new_value.it_value.tv_sec = 10; // 2s
new_value.it_value.tv_nsec = 0;
new_value.it_interval.tv_sec = 0; // one shot
new_value.it_interval.tv_nsec = 0;
/*启动timerfd绑定的定时器,0表示启动相对定时器,时间=当前时间+new_value.it_value,NULL表示旧的定时值*/
if (timerfd_settime(timerfd, 0, &new_value, NULL) == -1)
{
handle_error("timerfd_settime");
}
printf("timer started\n");
while (1)
{
int ret = read(timerfd, &exp, sizeof(uint64_t));
if (ret == sizeof(uint64_t)) //
{
printf("ret: %d\n", ret);
printf("expired times: %llu\n", exp);
break;
}
}
return 0;
}
2、 timerfd_create, timerfd_settime 和 read函数举例:首先设置单次触发定时器,就是设置 struct itimerspec new_value 结构体的成员new_value.it_interval.tv_sec = 5, new_value.it_interval.tv_nsec = 0,使得第一次触发后每隔5s再触发一次。
(37条消息) Linux下定时函数timerfd_xxx()的使用_爱就是恒久忍耐的博客-CSDN博客