3。在linux系统下如何用C或者C++编程实现定时器(timer)任务?
3。在linux系统下如何用C或者C++编程实现定时器(timer)任务?
请问在linux系统下,如何使用C或者C++编程实现定时器任务?需求是这样的,在某个逻辑1为真时,就启动一个定时器1(
定时为1分钟),1分钟到来后,检查当前的状态,如果满足某个逻辑2,定时器1就停掉,如果不满足,定时器1就停掉并另
外启动一个定时器2(定时30秒),30秒到来后,不管是否满足逻辑2,都停掉并开启一个新的定时器1。如此循环。。。。
。
我想问一下,在unix系统下,如何设置一个定时器,然后启动一个定时器,并在某个条件下能够停掉计时器。
注意,我这里要的计时器使用C/C++实现的,不是用crontab命令就能完成的
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
我最近也想做个,好像应该属于守护进程之类.唉,技术不行啊
守护进程属于cron之类吧,逻辑相对简单还可以,
我这个结构比较复杂,不是守护就能搞定的,需要用C/C++编程定时器实现
看看这三个函数,就可以实现了。
init_timer
add_timer
del_timer
哪里会有这些函数?
我一个都没找到呀
用sleep或者alarm都可以达到这个要求吧
设置一个定时器信号,注册一个定时信号处理函数.在函数中设置标记,然后就可以处理了.
参考了别人的程序 ,
其中主要程序如下,
///* ******mytimer.h****************
#ifndef _111_FILE_
#define _111_FILE_
#include <iostream>;
#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>;
#include <stdio.h>;
#include <sys/time.h>;
#include <fstream.h>;
typedef enum { S0_ok,S1_geta} alarm_record_status ;
int SetTimer(int n, int nMode =0);
void TimerRoutine(int signo, siginfo_t* info, void* context);
#endif
//////////////////////////////////////mytimer.cxx
#include "myapp.h"
#define SIGMYTIMER1 (SIGRTMAX)
using namespace std;
int main(int argc,char * argv[])
{
¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£
//
//start timer1
struct sigaction sysact ;
sigemptyset(&sysact.sa_mask);
sysact.sa_flags = SA_SIGINFO;
sysact.sa_sigaction = TimerRoutine1 ;
sigaction(SIGMYTIMER1, &sysact, NULL);
// nTimerFlag=1;
nTimer1ID=SetTimer(milliSecTimer1); //start timer1 as main timer:milliSecTimer1
}
//mode: 0 one time return£¬1£ºperiod return
int SetTimer1(int nElaspe, int nMode=1)
{
struct sigevent evp;
timer_t nTimerID;
evp.sigev_notify = SIGEV_SIGNAL;
evp.sigev_signo = SIGMYTIMER;
evp.sigev_value.sival_ptr = &nTimerID;
int nCreate = timer_create(CLOCK_REALTIME, &evp, &nTimerID);
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(nTimerID, 0, &value, &ovalue) == 0) //success
{
cout<<"Timer id:"<<nTimerID<<" nElaspe:"<<nElaspe<<endl;
}
}
else
{
cout<<"create timer error"<<endl;
}
return nTimerID;
}
void TimerRoutine1(int signo, siginfo_t* info, void* context)
{
if (signo != SIGMYTIMER)
{
return;
}
// do your job here
}