用户层定时器有两种,一种是timerfd,另一种是timer_create,前者比较新,使用比较方便。

Linux环境编程 用户层定时器使用一 timerfd的使用

https://blog.csdn.net/fuyuande/article/details/80658695

这里记录一下timer_create的用法。

先介绍一下相关接口,再结合一个简单的demo介绍一下使用

头文件:#include <signal.h>#include <time.h>/* * 创建定时器* 创建POSIX定时器,不会被传递给子进程。编译时候增加编译选项 -lrt* 定时器ID存储在timerid中,定时器ID在当前进程中是唯一的,除非定时器* 被删除。初始化的时候定时器未启动。* clockid定义了定时器计时的方法,有如下几个值:* CLOCK_REALTIME : 可设置的系统范围的实时时钟* CLOCK_MONOTONIC : 单调递增的时钟,系统启动后不会被改变* CLOCK_PROCESS_CPUTIME_ID : 用于测量当前进程(包括所有线程)CPU占用时间,包含用户调用和系统调用,* CLOCK_THREAD_CPUTIME_ID : 用于测量当前线程CPU占用时间,包含用户调用和系统调用* 参数sevp指出该如何通知调用者定时器超时信息,根据sevp.sigev_notify字段,该字段有如下值* SIGEV_NONE : 定时器超时后不使用异步通知,可能的情况是使用timer_gettime来监控定时器* SIGEV_SIGNAL : 一旦超时,产生一个信号,任何时候,至多只有一个信号会发送到队列里面,可以使用timer_getoverrun来获取超时次数* SIGEV_THREAD : 新建一个线程去处理,该线程执行sigev_notif_function为入口函数* SIGEV_THREAD_ID : linux独有,发出一个信号,和SIG_NAL类似,只不过该信号发送到指定的线程。* NULL : 如果sevp被设置为NULL,相当于SIGEV_SIGNAL,信号是SIGALRM* 返回值,成功返回0,失败返回-1并将错误码设置到errno里 */int timer_create(clockid_t clockid, struct sigevent *sevp, timer_t *timerid);使用到的时间参数数据结构体有下面两该个
struct timespec {time_t tv_sec;                /* Seconds */long   tv_nsec;               /* Nanoseconds */
};
struct itimerspec {struct timespec it_interval;  /* Timer interval */struct timespec it_value;     /* Initial expiration */
};/** 启动/关闭定时器* itimerspec将时间分为秒和纳秒的组合* 如果参数new_value->it_value不为0,则启动定时器。如果定时器已经启动则覆盖之前的定时器设置* 如果参数new_value->it_value为0则关闭定时器。* 参数new_value->it_interval用于定时器重启的间隔,即当定时器超时后下一次超时的间隔。* 参数flags为0的话默认是相对时间,也可以使用TIMER_ABSTIME绝对时间* 成功返回0,失败返回-1,并设置errno*/
int timer_settime(timer_t timerid, int flags, const struct itimerspec *new_value, struct itimerspec * old_value);/** 返回到下一次超时的时间间隔,如果返回0说明已经超时*/
int timer_gettime(timer_t timerid, struct itimerspec *curr_value);/** 删除定时器* 成功返回0,失败返回-1并设置errno*/int timer_delete(timer_t timerid); 

下面是一个简单例子,创建一个定时器,超时时间1s, 超时后发出信号,超时5次后程序退出

/**  Description : Linux用户层定时器使用<二>定义一个每个1s触发的定时器,定时器触发后发出信号并打印,超过5次后程序自动退出。*  Author      : mason*  Date        : 201808*/#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>#define EXPIRE_MAX 5
static int expire_cnt;#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \} while (0)/* 定时器回调函数 */
void timer_handler()
{  if (expire_cnt < EXPIRE_MAX){expire_cnt++;}printf("timer expire\r\n");return;
} int main(int argc, char *argv[])
{timer_t timerid;struct sigevent sev;struct itimerspec its;/* 注册信号回调函数 */sev.sigev_notify = SIGEV_SIGNAL;sev.sigev_signo = SIGUSR1;sev.sigev_value.sival_ptr = &timerid;signal(SIGUSR1, timer_handler);/* 创建定时器 */if (timer_create(CLOCK_MONOTONIC, &sev, &timerid) == -1){errExit("timer_create");}/* 设置定时器时间参数超时1s */its.it_value.tv_sec = 1;its.it_value.tv_nsec = 0;its.it_interval.tv_sec = its.it_value.tv_sec;its.it_interval.tv_nsec = its.it_value.tv_nsec;/* 启动定时器 */if (timer_settime(timerid, 0, &its, NULL) == -1){errExit("timer_settime");}/* 超时5次后退出 */while (expire_cnt != 5) {sleep(1);}/* 删除定时器 */timer_delete(timerid);exit(EXIT_SUCCESS);
}

timer_create和timerfd相比的话,接口复杂,需要使用到信号机制,实际使用的话建议使用timerfd。

参考资料:

1. man timer_create: https://linux.die.net/man/2/timer_create

2. POSIX定时器:timer_settime()

Linux 环境编程 用户层定时器使用二 timer_create的使用相关推荐

  1. Linux环境编程 用户层定时器使用一 timerfd的使用

    timerfd是linux提供的定时器机制,基于文件描述符,定时器精度最高可达纳秒级别,接口包括定时器创建.启动定时器.关闭定时器和删除定时器.下面介绍一下timerfd  API接口和一个结合epo ...

  2. Linux环境编程多线程定时器、延时队列以及分布式定时器的现实与原理分析

    Linux环境编程多线程定时器.延时队列以及分布式定时器的现实与原理分析丨线程池丨中间件丨后端开发丨C/C++linux服务器开发 视频讲解如下,点击观看: Linux环境编程多线程定时器.延时队列以 ...

  3. Linux环境编程05

    目录 Linux环境编程05 一.信号相关基本概念 二.信号捕获 三.进程休眠信号 四.信号集和信号阻塞 五.附带数据信息的信号处理(较难) 六.定时器 Linux环境编程05 声明:本学习笔记为个人 ...

  4. 林世霖. linux环境编程图文指南,linux环境编程图文指南

    linux环境编程图文指南是一本linux编程环境配置指南,由林世霖.钟锦辉和李建辉三人共同编著.本书定位Linux环境编程入门与提高,全书拥有近400余幅案例图表,200多篇源代码,作者很多编程初入 ...

  5. Linux环境编程(4)文件操作相关内容补充

    Linux环境编程(4) 文件同步: 1.在写入数据时内存与磁盘之间也有一个缓冲区,这种机制降低了磁盘读写次数,提高了读写的效率. 2.但这种机制带来的后果就是磁盘中的数据与实写入的数据不匹配,系统提 ...

  6. Linux环境编程姜林美,Linux环境编程习题_编程题_答案.pdf

    Linux环境编程习题_编程题_答案 Linux 境编程-人民邮电出版社-姜林美 课后习题(编程题)答案 第三章 1 第五章 4 第六章 9 第七章 19 第八章 22 第九章 35 第十章 38 三 ...

  7. Linux 环境编程 day01 Linux系统介绍、GNU编译工具、静态/共享库、环境变量表

    Linux 环境编程 day01 Linux系统介绍.GNU编译工具.静态/动态库.环境变量表 学习Linux环境编程的原因 UNIX系统介绍 Linux系统介绍 GNU工程 POSIX标准 GNU通 ...

  8. linux环境编程从应用,linux环境编程:从应用到内核

    <UNIX环境高级编程>(简称APUE)几乎是Linux领域程序员人手必备的一本书.但在掌握和理解APUE的内容后,又该如何继续提高自己的技能,如何更深入地理解Linux环境编程及其背后的 ...

  9. Linux环境编程--多线程

    本文作者: 姚继锋 (2001-08-11 09:05:00)    时隔多年 原文地址已经无从查...  居然是2001年就写了  今天看来对初学者还是很有参考意义  所以特转给大家 本人在原文基础 ...

最新文章

  1. C语言网络编程:close或者shutdown断开通信连接
  2. tomcat中server.xml文件详解
  3. flutter 移动通知_Flutter移动电商实战 --(24)Provide状态管理基础
  4. linux dmesg 格式化时间
  5. Element-ui自定义主题换肤
  6. 破解visual sourcesafe数据库admin用户密码
  7. DCMTK:使用dcmimage库将DICOM图像转换为PPM或PGM
  8. iOS Hacker dumpdecrypted脱壳
  9. mysql分析日志_MYSQL 索引(三)--- SQL日志分析
  10. 极限挑战logo的制作教程
  11. Taro button点击切换选中状态
  12. 【ICLR 2018】模型集成的TRPO算法【附代码】
  13. 天锐绿盾加密系统是做什么用的?
  14. 学术会议html模板,标准的学术会议的通知模板
  15. 智能车改舵机中值步骤_智能车制作全过程(飞思卡尔---舵机篇)
  16. java多个文件压缩成zip文件
  17. linux内核 初始化 wifi,Linux驱动(六)----Wifi基础
  18. vite:vue中引入图片报错require is not defined
  19. Mastering the game of Go with deep neural networks and tree search翻译
  20. 通过URL在前端页面传参的方法

热门文章

  1. TreeView和DataGridView控件组合使用
  2. linux 自动安装 get,linux下自动获取并安装软件包 apt-get 的命令介绍
  3. 新安江遗传算法c语言,基于遗传算法的新安江模型参数优化率定(四)
  4. PyTorch 实现经典模型1:LeNet5
  5. 2.5 数据不匹配时,偏差和方差的分析-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  6. STM32 基础系列教程 25 - USB_HID_mouse
  7. C标准库和glibc(C运行库)的关系
  8. DFT实际应用-User-Defined Test Points Example
  9. Android学习笔记:ScrollView卷轴视图
  10. CAD计算机辅助设计与BIM的区别,3D建模、CAD和BIM三者之间的差异是什么,有什么区别?...