Linux下定时器的示例代码

Linux下定时器的问题

示例代码:

#include <iostream>
using namespace std;
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>
#include <time.h>

#define SIGMYTIMER (SIGRTMAX)

int SetTimer(int nElaspe , int nMode = 1);
void TimerRoutine(int signo, siginfo_t* info, void* context);

int main()
{
cout<<"proc id: "<<(long)getpid()<<" main thread id:"<<pthread_self()<<endl;

struct sigaction sysact;

//setup signal handler
sigemptyset(&sysact.sa_mask);
sysact.sa_flags = SA_SIGINFO;
sysact.sa_sigaction = TimerRoutine ;
sigaction(SIGMYTIMER, &sysact, NULL);

SetTimer(500);
SetTimer(500);
SetTimer(500);

while(1)
{
sleep(1);
}
cout<<"quit!!!!"<<endl;
return 0;
}

timer_t IDList[20]; //use to save timer id;

//mode: 0: oneshot timer; 1: periodicity timer
int SetTimer(int nElaspe, int nMode)
{
struct sigevent evp;

static int nTimerIndex = 0;

evp.sigev_notify = SIGEV_SIGNAL;
evp.sigev_signo = SIGMYTIMER;
evp.sigev_value.sival_ptr = &IDList[nTimerIndex];
int nCreate = timer_create(CLOCK_REALTIME, &evp, &IDList[nTimerIndex]);

if (nCreate == 0) //success
{
struct itimerspec value;
struct itimerspec ovalue;

value.it_value.tv_sec = nElaspe / 1000;
value.it_value.tv_nsec = (nElaspe % 1000) * (1000 * 1000);

if (nMode == 1)
{
value.it_interval.tv_sec = value.it_value.tv_sec;
value.it_interval.tv_nsec = value.it_value.tv_nsec;
}
else
{
value.it_interval.tv_sec = 0;
value.it_interval.tv_nsec = 0;
}

if (timer_settime(IDList[nTimerIndex], 0, &value, &ovalue) == 0) //success
{
cout<<"Timer id:"<<IDList[nTimerIndex]<<" nElaspe:"<<nElaspe<<endl;
}
}
else
{
cout<<"create timer error"<<endl;
}

//++nTimerIndex;
return IDList[nTimerIndex++];
}

//timer singal proc
void TimerRoutine(int signo, siginfo_t* info, void* context)
{
if (signo != SIGMYTIMER) return;

//display time
time_t currtime;
time(&currtime);
tm* pTm = localtime(&currtime);
if (pTm)
{
char sBuf[30];
sprintf(sBuf, "%02d:%02d:%02d", pTm->tm_hour, pTm->tm_min, pTm->tm_sec);
cout<<sBuf;
}

cout<<" timer_id:"<<*(int*)(info->si_value.sival_ptr)<<" sig_id:"<<signo<<" thread_id:"<<pthread_self()<<endl;
}

编译:

librt是一个系统库,你不必管他的路径(在usr/lib中),在编译时记得连接就行了。

g++ -o demo demo.cpp -lrt

 

时间: 2024-07-30 10:49:24

Linux下定时器的示例代码的相关文章

jquery取消选择select下拉框示例代码

 本篇文章主要是对jquery取消选择select下拉框示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 有三个select下拉框 一个大类,两个小类隐藏,需要在选择大类的时候,小类显示同时清除另外的小类选择的项 这需求有点儿..........   下面是三个select:   代码如下: <select name="pWaqqqy" id="sel_type" onchange="selectFunction()">

怎样在Windows和Linux下写相同的代码

目前,Linux在国内受到了越来越多的业内人士和用户的青睐.相信在不久的将来,在国内为Linux开发 的应用软件将会有很大的增加(这不,金山正在招兵买马移植WPS呢).由于未来将会是Windows和Linux两强鼎立的格局,怎样能够使得开发的软件保持最大的可移植性就成了一个很重要的问题.小弟经过一段时间的摸索,找到了这个问题的圆满解答. 在Linux下,所有的开发工具和库都属于自由软件,可以免费获得并且功能强大.如果这些工具和库都有相应的Windows版,那么我们就能够在Windows和Linu

求linux下c语言开源代码

问题描述 求linux下c语言开源代码 谁有c的开源代码,上午面试,面试官出了道题,让我找一个源代码,20个左右的.c.h文件, 让编译完给他发过去,并了解功能,谢谢啦 解决方案 github google codeproject sourceforge 面试官无非就是考下你是不是听说过这4个网站之一. 解决方案二: 我有Linux操作系统源代码,要吗?893277858QQ 解决方案三: Linux本身就是开源的,你要下载源代码很简单啊http://www.kernel.org/ 这个上面就是

Linux 下定时器的实现方式分析

定时器属于基本的基础组件,不管是用户空间的程序开发,还是内核空间的程序开发,很多时候都需要有定时器作为基础组件的支持,但使用场景的不同,对定时器的实现考虑也不尽相同,本文讨论了在 Linux 环境下,应用层和内核层的定时器的各种实现方法,并分析了各种实现方法的利弊以及适宜的使用环境. 首先,给出一个基本模型,定时器的实现,需要具备以下几个行为,这也是在后面评判各种定时器实现的一个基本模型 [1]: StartTimer(Interval, TimerId, ExpiryAction) 注册一个时

Angularjs实现带查找筛选功能的select下拉框示例代码_AngularJS

前言 对于select的下拉列表,像国家选择这样的功能,全世界那么多国家,一直拉滚动条多辛苦,眼睛也要盯着找,累!所以为优化用户体验,带查找功能的下拉框是非常非常有必要的.都知道jquery里有这样的插件,但我们用的是Angularjs,更希望用双向绑定,指令的方式优雅地解决这个问题. 分析 我们的目标是在原来的<select ng-options="">标签上新加一个属性 select-search 就能支持查找的功能.如果这个属性没起作用,也不影响原来的select的功

jquery动态加载select下拉框示例代码

 动态加载select下拉框的实现方法有很多,在接下来的文章中为大家介绍下jquery是如何实现的 如题,直接上代码,实战学习.  代码如下: <head><title>jquery实现动态加载select下拉选项</title>  <script type="text/javascript">  function init(){  makemoduleSelect();  }  //加载模板下拉框选项  function makemod

jquery取消选择select下拉框示例代码_jquery

有三个select下拉框一个大类,两个小类隐藏,需要在选择大类的时候,小类显示同时清除另外的小类选择的项这需求有点儿.......... 下面是三个select: 复制代码 代码如下: <select name="pWaqqqy" id="sel_type" onchange="selectFunction()">        <option value="">全部</option>   

linux下让irb实现代码自动补全的功能

    我不知道其他系统上irb是否有此功能,但是在ubuntu上ruby2.1.2自带的irb默认是没有代码自动补全功能的,这多少让人觉得有所不便.其实加上也很简单,就是在irb里加载一个模块:require 'irb/completion' ,但是我们不可能每次都手动敲着一行代码,KISS和DRY哪去了?     简单的一劳永逸的方法是在~/.irbrc里添加irb运行时需要执行的代码即可.你要问我怎么知道.irbrc文件路径的,你可以通过IRB.rc_file看到.网上还有更高级的自动补全

jquery动态加载select下拉框示例代码_jquery

如题,直接上代码,实战学习. 复制代码 代码如下: <head><title>jquery实现动态加载select下拉选项</title> <script type="text/javascript"> function init(){ makemoduleSelect(); } //加载模板下拉框选项 function makemoduleSelect(){ $.ajax({ url : 'indexStatisticsAction_g