免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8415 | 回复: 7
打印 上一主题 下一主题

3。在linux系统下如何用C或者C++编程实现定时器(timer)任务? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-27 09:53 |只看该作者 |倒序浏览
3。在linux系统下如何用C或者C++编程实现定时器(timer)任务?
请问在linux系统下,如何使用C或者C++编程实现定时器任务?需求是这样的,在某个逻辑1为真时,就启动一个定时器1(

定时为1分钟),1分钟到来后,检查当前的状态,如果满足某个逻辑2,定时器1就停掉,如果不满足,定时器1就停掉并另

外启动一个定时器2(定时30秒),30秒到来后,不管是否满足逻辑2,都停掉并开启一个新的定时器1。如此循环。。。。



我想问一下,在unix系统下,如何设置一个定时器,然后启动一个定时器,并在某个条件下能够停掉计时器。
注意,我这里要的计时器使用C/C++实现的,不是用crontab命令就能完成的

论坛徽章:
0
2 [报告]
发表于 2005-06-27 10:46 |只看该作者

3。在linux系统下如何用C或者C++编程实现定时器(timer)任务?

我最近也想做个,好像应该属于守护进程之类.唉,技术不行啊

论坛徽章:
0
3 [报告]
发表于 2005-06-27 10:50 |只看该作者

3。在linux系统下如何用C或者C++编程实现定时器(timer)任务?

守护进程属于cron之类吧,逻辑相对简单还可以,
我这个结构比较复杂,不是守护就能搞定的,需要用C/C++编程定时器实现

论坛徽章:
5
4 [报告]
发表于 2005-06-27 15:29 |只看该作者

3。在linux系统下如何用C或者C++编程实现定时器(timer)任务?

看看这三个函数,就可以实现了。

init_timer
add_timer
del_timer

论坛徽章:
0
5 [报告]
发表于 2005-06-27 19:39 |只看该作者

3。在linux系统下如何用C或者C++编程实现定时器(timer)任务?

哪里会有这些函数?
我一个都没找到呀

论坛徽章:
0
6 [报告]
发表于 2005-06-27 20:05 |只看该作者

3。在linux系统下如何用C或者C++编程实现定时器(timer)任务?

用sleep或者alarm都可以达到这个要求吧

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
7 [报告]
发表于 2005-06-27 21:54 |只看该作者

3。在linux系统下如何用C或者C++编程实现定时器(timer)任务?

设置一个定时器信号,注册一个定时信号处理函数.在函数中设置标记,然后就可以处理了.

论坛徽章:
0
8 [报告]
发表于 2005-06-28 11:48 |只看该作者

3。在linux系统下如何用C或者C++编程实现定时器(timer)任务?

参考了别人的程序 ,
  其中主要程序如下,
///* ******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
   
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP