用c语言编写定时器程序,C语言怎么实现定时器
C语言怎么实现定时器 比如我现在要3分钟执行一次我的函数 怎么做。
|
Linux下的定时器:alarm()与setitimer()
http://blog.csdn.net/feiyinziiuxx/archive/2009/08/26/4488140.aspx
|
// init timer
void TimerFactory::init_timer()
{
struct itimerval value;
value.it_value.tv_sec = 1; // min interval 1 second
value.it_value.tv_usec = 0;
value.it_interval = value.it_value;
Setitimer(ITIMER_REAL, &value, NULL );
return;
}
// init signal
void TimerFactory::init_signal()
{
Signal(SIGALRM, on_alarm);
return;
}
// callback to do things when SIGALARM arrived
void TimerFactory::on_alarm(int signo)
{
// do things you like here.
return;
}
|
如果是c++,可以参考这个,里面有一个现成的类,或者用boost::asio库
http://stackoverflow.com/questions/503866/timer-class-in-linux
|
SIGPIPE 是一种由软件条件产生的信号,在例 3.7 “管道”中已经介绍过了。
本节主要介绍 alarm 函数和 SIGALRM 信号。
#include
unsigned int alarm(unsigned int seconds);
调用 alarm 函数可以设定一个闹钟,也就是告诉内核在 seconds 秒之后给当前
进程发 SIGALRM 信号,该信号的默认处理动作是终止当前进程。这个函数的返
回值是 0 或者是以前设定的闹钟时间还余下的秒数。打个比方,某人要小睡一
觉,设定闹钟为 30 分钟之后响,20 分钟后被人吵醒了,还想多睡一会儿,于
是重新设定闹钟为 15 分钟之后响,“以前设定的闹钟时间还余下的时间”就是
10 分钟。如果 seconds 值为 0,表示取消以前设定的闹钟,函数的返回值仍然
是以前设定的闹钟时间还余下的秒数。
例 6.1. alarm
#include
#include
int main(void)
{
int counter;
alarm(1);
for(counter=0; 1; counter++)
printf("counter=%d ", counter);
return 0;
}
这个程序的作用是 1 秒钟之内不停地数数,1 秒钟到了就被 SIGALRM 信号终
止。
|
网上找到的, 我整理了一下:
使用定时器的目的无非是为了周期性的执行某一任务, 或者是到了一个指定时间去执行某一任务. 要达到这一目的, 一般有两个常见的比较有效的方法. 一个是用Linux内部的三个定时器, 另一个是用sleep, usleep函数让进程睡眠一段时间, 其实还有一个方法, 那就是用gettimeofday, difftime等自己来计算时间间隔, 然后时间到了就执行某一任务, 但这种方法效率低, 所以不常用.
Linux 为每个进程提供的3个内部计时器:
ITIMER_REAL: 给一个指定的时间间隔, 按照实际的时间来减少这个计数, 当时间间隔为0的时候发出SIGALRM信号.
ITIMER_VIRTUAL: 给定一个时间间隔, 当进程执行的时候才减少计数, 时间间隔为0的时候发出SIGVTALRM信号.
ITIMER_PROF: 给定一个时间间隔, 当进程执行或者是系统为进程调度的时候, 减少计数, 时间到了, 发出SIGPROF信号, 这个和ITIMER_VIRTVAL联合, 常用来计算系统内核时间和用户时间.
常用到的函数:
#include
int getitimer (int which, struct itimerval* value);
int setitimer (int which, struct itimerval* newvalue, struct itimerval* oldvalue);
struct timeval
{
long tv_sec;/* 秒 */
long tv_usec;/* 微秒 */
};
struct itimerval
{
struct timeval it_interval; /* 时间间隔 */
struct timeval it_value;/* 当前时间计数 */
};
it_interval用来指定每隔多长时间执行任务, it_value用来保存当前时间离执行任务还有多长时间. 比如说, 你指定it_interval为2秒(微秒为0), 开始的时候我们把it_value的时间也设定为2秒(微秒为0), 当过了一秒, it_value就减少一个为1, 再过1秒, 则it_value又减少1, 变为0, 这个时候发出信号(告诉用户时间到了, 可以执行任务了), 并且系统自动把it_value的置重置为it_interval的值, 即2秒, 再重新计数.
|
一种不可移植的方法是调用sleep(),一种可移植但不优雅的方法是:
/* 前文再续 */
调用gettimeofday()取得此刻的时间
while(1)
{
调用gettimeofday()取得此刻的时间
if(两个时间差满足你的要求) break;
}
/* 书接下一回 */
|
不推荐使用 有时候会导致CPU利用率老高了
用1楼说的alarm()与setitimer()
具体用法google一下 写个简单的代码练习一下就会了
|
这个玩意就是一种无奈,很多时候都要在可移植性和效率中作二选一。
|
你可以直接调用alarm。
其本质就是计时加上信号触发。
此外,select计时更精确,虽然不是专门用来计时的
|
很精辟!
|
学习
|
mark
用c语言编写定时器程序,C语言怎么实现定时器相关推荐
- c语言编写modbus程序,C语言编写modbus协议
<C语言编写modbus协议>由会员分享,可在线阅读,更多相关<C语言编写modbus协议(23页珍藏版)>请在人人文库网上搜索. 1.include / 字地址 0 - 25 ...
- c语言编写考试程序,c语言考试编写三个程序:1.从键盘输入一些字符,逐个把它们送到磁? 爱问知识人...
下面三段程序代码都是我在VC6.0编译器上调试通过的.请给分 //test1-2.c #include #include int main() { FILE *fp = fopen("fil ...
- c语言编写开关程序,C语言开关语句:switch
1)简单介绍switch(开关语句)的形式: switch: switch (表达式) { case 常数表达式1: break; case 常数表达式2: break; case 常数表达式3: b ...
- c语言编写excel程序,C语言写excel文件(csv格式)
csv:简化版excel,在PC机上等同于excel,可进行各种excel计算.画图. #defineEACH_FILE_MAX_BYTE52428800 //-------------------- ...
- python输入一个正整数n求下列算式的值_C语言编写程序:输入一个正整数x和一个正整数n,求下列算式的值。,C语言 编写一个程序,输入一个正整数,求出它是几位数。...
导航:网站首页 > C语言编写程序:输入一个正整数x和一个正整数n,求下列算式的值.,C语言 编写一个程序,输入一个正整数,求出它是几位数. C语言编写程序:输入一个正整数x和一个正整数n,求下 ...
- C语言编写一个赋值程序,实验2 用C语言编写简单程序——2.1 基本数据处理.doc
实验2 用C语言编写简单程序--2.1 基本数据处理 实验2 用C语言编写简单程序 2.1 基本数据处理 [实验目的] (1)掌握算术表达式和赋值表达式的使用. (2)掌握基本输出函数的使用. (3) ...
- 编写lisp程序解一元二次方程_用C语言编写一程序求解一元二次方程的根。
展开全部 C语言编写一程序求解32313133353236313431303231363533e78988e69d8331333365643661一元二次方程的根: #include #include ...
- 心碎的图案怎么用c语言编出来,教案实验2用c语言编写简单程序.doc
教案实验2用c语言编写简单程序 实验2 用C语言编写简单程序 2.1 基本数据处理1.调试示例 改正下列程序中的错误,求华氏温度100oF对应的摄氏温度?计算公式如下,其中:c 表示摄氏温度,f 表示 ...
- 用 C 语言编写的程序被称为,用c语言编写的程序被称为
快速导读: Q1:用C语言编写以下程序 #includeintmain(void){ intm,n,i,t; printf("InputM,N(int0if(scanf("%d%d ...
- 用PL/SQL语言编写一程序,实现按部门分段(6000以上、(6000,3000)、3000元以下)统计各工资段的职工人数、以及各部门的工资总额(工资总额中不包括奖金)
用PL/SQL语言编写一程序,实现按部门分段(6000以上.(6000,3000).3000元以下)统计各工资段的职工人数.以及各部门的工资总额(工资总额中不包括奖金) 输出到一张表中 直接输出在屏幕 ...
最新文章
- Xshell 配置是vi显示多种颜色
- SAP SD基础知识之输出控制(Output Control)
- 如何编写常见语言带默认参数值的函数
- iPhone 13发售日期偷跑:9月17日全系开售、共4款
- java静态局部变量_java中成员变量,局部变量,静态变量的辨析
- 使用JAXP对XML文档进行DOM解析
- 【ArcGIS风暴】ArcGIS获取一个省各个地区界内的河流的总长度--以甘肃省为例
- 用ISA阻挡用户向论坛发贴子
- 纽约佩斯大学孔子学院:中国故事
- 创建并运用客户化jsp标签
- 数据结构与算法 第二章 数据结构中的线性结构
- 解决SVG animation 在IE中不起作用
- MFC学习日志(一)
- linux系统移植步骤
- 如何高效率安排你的时间?Mac精品日程管理软件推荐
- 签名验签服务器的作用,签名验签服务器
- C++STL容器的比较
- Java Server Faces_用JavaServer Faces开发Web应用(4) (转)
- Python爬虫伪装,请求头User-Agent池,和代理IP池搭建使用
- git大文件记录清除解决方案
热门文章
- mysql 数据库清理 磁盘空间
- win10分辨率不能调整_笔记本win10系统调整外接显示器分辨率的方法
- word里画的流程图怎么全选_流程图怎么做?用Word制作流程图超方便!
- 7-1 掉入陷阱的数字
- 使用matlab制作电子签名
- C# 使用 Response 导出 Excel 单元格格式设置为文本格式
- SpringMVCfrom:form表单标签和input表单标签简介
- 支付宝小程序 alipays协议链接跳转
- CVPR 历年 Best paper(1988-2020)汇总,持续更新~
- 4K图片(壁纸)免费下载网站【实用】