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语言怎么实现定时器相关推荐

  1. c语言编写modbus程序,C语言编写modbus协议

    <C语言编写modbus协议>由会员分享,可在线阅读,更多相关<C语言编写modbus协议(23页珍藏版)>请在人人文库网上搜索. 1.include / 字地址 0 - 25 ...

  2. c语言编写考试程序,c语言考试编写三个程序:1.从键盘输入一些字符,逐个把它们送到磁? 爱问知识人...

    下面三段程序代码都是我在VC6.0编译器上调试通过的.请给分 //test1-2.c #include #include int main() { FILE *fp = fopen("fil ...

  3. c语言编写开关程序,C语言开关语句:switch

    1)简单介绍switch(开关语句)的形式: switch: switch (表达式) { case 常数表达式1: break; case 常数表达式2: break; case 常数表达式3: b ...

  4. c语言编写excel程序,C语言写excel文件(csv格式)

    csv:简化版excel,在PC机上等同于excel,可进行各种excel计算.画图. #defineEACH_FILE_MAX_BYTE52428800 //-------------------- ...

  5. python输入一个正整数n求下列算式的值_C语言编写程序:输入一个正整数x和一个正整数n,求下列算式的值。,C语言 编写一个程序,输入一个正整数,求出它是几位数。...

    导航:网站首页 > C语言编写程序:输入一个正整数x和一个正整数n,求下列算式的值.,C语言 编写一个程序,输入一个正整数,求出它是几位数. C语言编写程序:输入一个正整数x和一个正整数n,求下 ...

  6. C语言编写一个赋值程序,实验2 用C语言编写简单程序——2.1 基本数据处理.doc

    实验2 用C语言编写简单程序--2.1 基本数据处理 实验2 用C语言编写简单程序 2.1 基本数据处理 [实验目的] (1)掌握算术表达式和赋值表达式的使用. (2)掌握基本输出函数的使用. (3) ...

  7. 编写lisp程序解一元二次方程_用C语言编写一程序求解一元二次方程的根。

    展开全部 C语言编写一程序求解32313133353236313431303231363533e78988e69d8331333365643661一元二次方程的根: #include #include ...

  8. 心碎的图案怎么用c语言编出来,教案实验2用c语言编写简单程序.doc

    教案实验2用c语言编写简单程序 实验2 用C语言编写简单程序 2.1 基本数据处理1.调试示例 改正下列程序中的错误,求华氏温度100oF对应的摄氏温度?计算公式如下,其中:c 表示摄氏温度,f 表示 ...

  9. 用 C 语言编写的程序被称为,用c语言编写的程序被称为

    快速导读: Q1:用C语言编写以下程序 #includeintmain(void){ intm,n,i,t; printf("InputM,N(int0if(scanf("%d%d ...

  10. 用PL/SQL语言编写一程序,实现按部门分段(6000以上、(6000,3000)、3000元以下)统计各工资段的职工人数、以及各部门的工资总额(工资总额中不包括奖金)

    用PL/SQL语言编写一程序,实现按部门分段(6000以上.(6000,3000).3000元以下)统计各工资段的职工人数.以及各部门的工资总额(工资总额中不包括奖金) 输出到一张表中 直接输出在屏幕 ...

最新文章

  1. Xshell 配置是vi显示多种颜色
  2. SAP SD基础知识之输出控制(Output Control)
  3. 如何编写常见语言带默认参数值的函数
  4. iPhone 13发售日期偷跑:9月17日全系开售、共4款
  5. java静态局部变量_java中成员变量,局部变量,静态变量的辨析
  6. 使用JAXP对XML文档进行DOM解析
  7. 【ArcGIS风暴】ArcGIS获取一个省各个地区界内的河流的总长度--以甘肃省为例
  8. 用ISA阻挡用户向论坛发贴子
  9. 纽约佩斯大学孔子学院:中国故事
  10. 创建并运用客户化jsp标签
  11. 数据结构与算法 第二章 数据结构中的线性结构
  12. 解决SVG animation 在IE中不起作用
  13. MFC学习日志(一)
  14. linux系统移植步骤
  15. 如何高效率安排你的时间?Mac精品日程管理软件推荐
  16. 签名验签服务器的作用,签名验签服务器
  17. C++STL容器的比较
  18. Java Server Faces_用JavaServer Faces开发Web应用(4) (转)
  19. Python爬虫伪装,请求头User-Agent池,和代理IP池搭建使用
  20. git大文件记录清除解决方案

热门文章

  1. mysql 数据库清理 磁盘空间
  2. win10分辨率不能调整_笔记本win10系统调整外接显示器分辨率的方法
  3. word里画的流程图怎么全选_流程图怎么做?用Word制作流程图超方便!
  4. 7-1 掉入陷阱的数字
  5. 使用matlab制作电子签名
  6. C# 使用 Response 导出 Excel 单元格格式设置为文本格式
  7. SpringMVCfrom:form表单标签和input表单标签简介
  8. 支付宝小程序 alipays协议链接跳转
  9. CVPR 历年 Best paper(1988-2020)汇总,持续更新~
  10. 4K图片(壁纸)免费下载网站【实用】