linux 间隔定时器,Linux间隔定时器的使用 探索一

2011年1月17日

之前看《高级Unix编程》说有基本定时器与高级定时器之分

好像基本定时器不符合我的要求,那么就先来个高级的吧。

写个代码看看会有什么发生:

2011年1月18日

看下timer_create函数

intt1;

timer_t tm_id;//timer_t其实是个long型t1 = timer_create(CLOCK_REALTIME, NULL, &tm_id);

cout << "timer_create return "<< t1 << endl;

cout << "tm_id"<< tm_id << endl;

intt2;

timer_t tm_id2;//timer_t其实是个long型t2 = timer_create(CLOCK_REALTIME, NULL, &tm_id2);

cout << "timer_create return "<< t2 << endl;

cout << "tm_id"<< tm_id2 << endl;

可看到输出的第一个time_id是0,第二个是1,其实就是用数字标识timerID啦。

2011年1月21日

今天终于试验出了个timer的用法:

下面是代码:

#include#include#includeusingstd::cout;

usingstd::endl;

voidalrm_handler(inti)

{

printf("timer interrupt %d/n",i);

time_t tm_show;

time(&tm_show);

cout << "settime : "<< (long)tm_show << "s "<< endl;

}

intmain()

{

intt1;

timer_t tm_id;//timer_t其?实?是?个?long型?t1 = timer_create(CLOCK_REALTIME, NULL, &tm_id);

cout << "timer_create return "<< t1 << endl;

cout << "tm_id"<< tm_id << endl;

intt2;

timer_t tm_id2;//timer_t其?实?是?个?long型?t2 = timer_create(CLOCK_REALTIME, NULL, &tm_id2);

cout << "timer_create return "<< t2 << endl;

cout << "tm_id"<< tm_id2 << endl;

cout << "set the timer "<< tm_id << ": 5s"<< endl;

cout << "set timer "<< tm_id2 << ": 3s"<< endl;

signal(SIGALRM,alrm_handler); //<>说?最?好?不?要?用?signal,?管?它?呢?,?这?个?简?单?,?用?sigacttion也?太?烦?了?吧?

//set timer 0 5sstructitimerspec itmspec;

structtimespec ts;

//struct sigaction sa;

//sigfillset(&sa.sa_mask);

//sa.sa_flags = SA_SIGINFO;

//sa.sa_sigaction = handler;itmspec.it_interval.tv_sec = 5;

itmspec.it_interval.tv_nsec = 0;

itmspec.it_value.tv_sec = 5;

itmspec.it_value.tv_nsec = 0;

time_t tm_show;

time(&tm_show);

timer_settime(tm_id, NULL,&itmspec,NULL);//第?二?个?参?数?为?,?则?与?setitimer相?似?,?第?四?个?参?数?返?回?旧?的?定?时?器?值?cout << "settime : "<< (long)tm_show << "s "<< endl;

itmspec.it_interval.tv_sec = 3;

itmspec.it_interval.tv_nsec = 0;

itmspec.it_value.tv_sec = 3;

itmspec.it_value.tv_nsec = 0;

timer_settime(tm_id2, NULL,&itmspec,NULL);

while(1);

return0;

}

makefile文件:

# # # # # # # # # # # # # # # # # # # # #

#  Makefile for pafone, general use

#                       2011.01.18

# # # # # # # # # # # # # # # # # # # # #

LIBS = -lrt

OBJS = main.o

TARGET = timer

#GCFLAGS :compile flags, GDFLAGS: link flags

GCFLAGS =

GDFLAGS =

GCC  = g++

all : $(OBJS)

$(GCC) -o $(TARGET) $(OBJS) $(LIBS)

@echo "compile success"

%.o : %.cpp

$(GCC) $(GCFLAGS) -c $< -o $@

clean :

rm -f $(TARGET) $(OBJS)

编译运行后的输出:

[root@pafone timer]# ./timer

timer_create return 0

tm_id0

timer_create return 0

tm_id1

set the timer 0: 5s

set timer 1: 3s

settime : 1295597124s

timer interrupt 14

settime : 1295597127s

timer interrupt 14

settime : 1295597129s

timer interrupt 14

settime : 1295597130s

timer interrupt 14

settime : 1295597133s

其中有一个是5s,另一个是3s的,但alrm_handler(inti)  函数传入来的i都是14,怎么区分是哪个定时器呢?    man 7 signal 发现里面的说明有说到handler的传入参数便是信号SIGALRM的#define值。

那么用sigacton可不可以区分是哪个定时器呢?还是一定要通过发送不同的信号来区分定时器?

注:信号会中断一些阻塞调用及sleep()函数,例如将while(1)改为sleep()

itmspec.it_interval.tv_sec = 3;

itmspec.it_interval.tv_nsec = 0;

itmspec.it_value.tv_sec = 3;

itmspec.it_value.tv_nsec = 0;

timer_settime(tm_id2, NULL,&itmspec,NULL);

sleep(100);

输出是:

[root@pafone timer]# ./timer

timer_create return 0

tm_id0

timer_create return 0

tm_id1

set the timer 0: 5s

set timer 1: 3s

settime : 1295599530s

timer interrupt 14

settime : 1295599533s

[root@pafone timer]#

即它会在第一个定时信号后返回,也就是定时信号中断了sleep.

如用用sigaction, 其它一些系统调用可以设置SA_RESTART使调用继续,但对sleep不起作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

游标操作 for Oracle

游标用来处理从数据库中检索的多行记录&#xff08;使用SELECT语句&#xff09;。利用游标&#xff0c;程序可以逐个地处理和遍历一次检索返回的整个记录集。 为了处理SQL语句&#xff0c;Oracle将在内存中分配一个区域&#xff0c;这就是上下文区。这个区包含了已经处理完的行…

python3经典实例_Python3十大经典错误及解决办法

接触了很多Python爱好者&#xff0c;有初学者&#xff0c;亦有转行人。不论大家学习Python的目的是什么&#xff0c;总之&#xff0c;学习Python前期写出来的代码不报错就是极好的。下面&#xff0c;严小样儿为大家罗列出Python3十大经典错误及解决办法&#xff0c;供大家学习。…

python谱聚类算法_谱聚类Spectral clustering(SC)

在之前的文章里&#xff0c;介绍了比较传统的K-Means聚类、Affinity Propagation(AP)聚类、比K-Means更快的Mini Batch K-Means聚类以及混合高斯模型Gaussian Mixture Model(GMM)等聚类算法&#xff0c;今天介绍一个比较近代的一类算法——Spectral Clustering 中文通常称为“谱…

LeetCode 1807. 替换字符串中的括号内容(哈希map)

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s &#xff0c;它包含一些括号对&#xff0c;每个括号中包含一个 非空 的键。 比方说&#xff0c;字符串 "(name)is(age)yearsold" 中&#xff0c;有 两个 括号对&#xff0c;分别包含键 “name” 和 “age” 。 你知…

bootice.exe linux 启动盘,下载BOOTICE来把你的U盘做成启动盘

为了方便维护电脑&#xff0c;需要制作一个合适的U盘启动盘。网上制作U盘启动盘的工具也有很多&#xff0c;我下面使用bootice这个U盘启动盘制作工具来制作U盘启动盘。下载BOOTICE1、BOOTICE>分区管理G&#xff0c;对U盘进行格式化&#xff0c;FAT16&#xff0c;卷标设置为G…

数据类型的选择

1、CHAR与VARCHAR CHAR与VARCHAR类型类似&#xff0c;都用来存储字符串。 CHAR&#xff1a;固定长度&#xff0c;处理速度较VARCHAR快&#xff0c;但浪费空间。 VARCHAR&#xff1a;可变长度 1 CHAR(4)和VARCHAR(4)列检索的值并不总相同&#xff0c;CHAR列删除了尾部的空格 2、…

excel打开空白_啥?下载的文件显示“文件已损坏,无法打开”?

推荐文章&#xff1a;Windows10系统的优化工具神器对于一个开发人员的我&#xff0c;这两天在网站做一个导出Excel表格功能&#xff0c;遇到了一个坑。在本地测试导出并且可以打开&#xff0c;但是到了测试环境导出打开却显示“文件已损坏&#xff0c;无法打开”。刚开始以为是…

erp故障处理流程图_PLC故障常见原因及处理方法!

欢迎关注“热控圈 ” ID&#xff1a;rekongquan传播热控知识&#xff0c;分享技术精华&#xff01;第一部分、运行中PLC故障常见原因及处理方法(一)、外围电路元器件故障此类故障在PLC工作一定时间后的故障中经常发生。在PLC控制回路中如果出现元器件损坏故障&#xff0c;PLC控…

LeetCode 1808. 好因子的最大数目(整数拆分,乘积最大)

文章目录1. 题目2. 解题1. 题目 给你一个正整数 primeFactors 。你需要构造一个正整数 n &#xff0c;它满足以下条件&#xff1a; n 质因数&#xff08;质因数需要考虑重复的情况&#xff09;的数目 不超过 primeFactors 个。n 好因子的数目 最大化。 如果 n 的一个因子可以…

请输入星期的第一个字母c语言,C语言经典案例:请输入星期几的第一个字母来判断一下是星期几,...

需求描述&#xff1a;请输出礼拜几的第一个字母来断定一下是礼拜几&#xff0c;假如第一个字母一样&#xff0c;则持续断定第二个字母。C语言案例分析&#xff1a;用情形语句比拟好&#xff0c;假如第一个字母一样&#xff0c;则断定用情形语句或if语句断定第二个字母。实现代码…

实用crontab命令

常用crontab如下&#xff1a; crontab -e 编辑 crontabcrontab -l 显示 crontabcrontab -r 删除 crontabcrontab -v 显示上一次编辑 crontab 的时间&#xff0c;但不是所有系统适用。 编辑crontab在指令模式輸入 "crontab -e" 便会用预设编辑器打开 crontab &#…

安卓apk签名提取工具_Android测试工具入门介绍(二)

今天我们来讲讲一款牛逼的安卓集成工具&#xff1a;就是大名还算顶顶的AndroidKill&#xff1b;先来个软件界面截图&#xff1a;多么简单有华丽的界面啊&#xff01;我说的是功能华丽&#xff0c;该有的功能他都有。首先我们先点开菜单中的Android&#xff0c;配置下APKTOOL管理…

atoi函数_每日一道 LeetCode (50):字符串转换整数 (atoi)

❝每天 3 分钟&#xff0c;走上算法的逆袭之路。❞前文合集每日一道 LeetCode 前文合集代码仓库GitHub&#xff1a;https://github.com/meteor1993/LeetCodeGitee&#xff1a;https://gitee.com/inwsy/LeetCode题目&#xff1a;最长回文子串难度&#xff1a;「中等」题目来源&a…

面向对象4大特性的作用

文章目录1. 封装2. 抽象3. 继承4. 多态学习自 极客时间《设计模式之美》 1. 封装 隐藏保护内部数据&#xff0c;不被随意修改&#xff0c;提高可维护性仅暴露必要的接口&#xff0c;提高易用性 2. 抽象 提高代码可扩展、可维护性&#xff0c;修改不需要改变定义&#xff0c;…

计算机c语言二级试题及答案,计算机c语言二级考试试题及其答案.doc

计算机二级试题一选择题(1)下列叙述中正确的是A)算法的效率只与问题的规模有关&#xff0c;而与数据的存储结构无关B)算法的时间复杂度是指执行算法所需要的计算工作量C)数据的逻辑结构与存储结构是一一对应的D)算法的时间复杂度与空间复杂度一定相关(2)在结构化程序设计中&…

远程连接Kali Linux使用PuTTY实现SSH远程连接

远程连接Kali Linux使用PuTTY实现SSH远程连接 本书主要以在Android设备上安装的Kali Linux操作系统为主&#xff0c;介绍基于Bash Shell渗透测试。由于在默认情况下&#xff0c;在Android设备上安装的Kali操作系统没有安装任何工具。如果直接在手机或平板上安装一些软件时&…

python 百度ocr安装_Python调用百度OCR实现图片文字识别的示例代码

百度AI提供了一天50000次的免费文字识别额度&#xff0c;可以愉快的免费使用&#xff01;下面直接上方法&#xff1a; 首先在百度AI创建一个应用&#xff0c;按照下图创建即可&#xff0c;创建后会获得如下&#xff1a;创建后会获得如下信息&#xff1a; APP_ID ****** API_KE…

哪些代码设计看似是面向对象,实际是面向过程的?

文章目录1. 滥用 getter、setter 方法2. 滥用全局变量、全局方法3. 数据、方法分离学习自 极客时间《设计模式之美》 1. 滥用 getter、setter 方法 违反了封装特性&#xff0c;风格退化为面向过程编程 2. 滥用全局变量、全局方法 Constants 类 所有的常量都放在这个类中&…

vue 图片拖动加载 类似于地图_前端性能优化之图片懒加载(附vue自定义指令)...

作者&#xff1a;lzg9527链接&#xff1a;https://juejin.cn/post/6903774214780616718在类电商类项目&#xff0c;往往存在大量的图片&#xff0c;如 banner 广告图&#xff0c;菜单导航图&#xff0c;美团等商家列表头图等。图片众多以及图片体积过大往往会影响页面加载速度&…

四元数c语言,C + OpenGL四元数

didierc..6对于你的第一个问题,我认为你的意思是"我如何代表",而不是"解释".最简单的方法是使用struct:typedef struct quaternion_t {double x,y,z,w;} quaternion_t;请注意,如上所述,通常的做法也是使用x,y,z和w作为组件名称(但只要您知道哪个是哪个,您的…