免费注册 查看新帖 |

Chinaunix

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

[函数] linux如何编程实现定时操作? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-03 17:59 |只看该作者 |倒序浏览
是这样的 有一个进程要每过10分钟进行一项操作,这个用sleep可以实现使程序挂起,但是网上看到一些帖子说sleep会浪费系统资源,请问有没有别的比sleep更好的办法来实现的这个功能?秩序是在用户态运行的。

论坛徽章:
0
2 [报告]
发表于 2009-08-03 18:07 |只看该作者
  还有这回事...
等楼下高人讲解

论坛徽章:
0
3 [报告]
发表于 2009-08-03 18:08 |只看该作者
不会浪费系统资源,此时进程处于睡眠状态的。另外的选择就是select,不过原理都一样。处于睡眠状态的进程不会占用CPU资源。

论坛徽章:
27
处女座
日期:2016-04-18 14:00:4515-16赛季CBA联赛之福建
日期:2023-03-31 15:54:2315-16赛季CBA联赛之深圳
日期:2020-06-02 10:10:5015-16赛季CBA联赛之广夏
日期:2019-07-23 16:59:452016科比退役纪念章
日期:2019-06-26 16:59:1315-16赛季CBA联赛之天津
日期:2019-05-28 14:25:1915-16赛季CBA联赛之青岛
日期:2019-05-16 10:14:082016科比退役纪念章
日期:2019-01-11 14:44:062016科比退役纪念章
日期:2018-07-18 16:17:4015-16赛季CBA联赛之上海
日期:2017-08-22 18:18:5515-16赛季CBA联赛之江苏
日期:2017-08-04 17:00:4715-16赛季CBA联赛之佛山
日期:2017-02-20 18:21:13
4 [报告]
发表于 2009-08-04 10:32 |只看该作者
/*  
  
   
  
Filename    : timer.cpp  
  
Compiler    : gcc 4.1.0 on Fedora Core 5  
  
Description : setitimer() set the interval to run function  
  
Synopsis    : #include <sys/time.h>  
  
              int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);  
  
              struct itimerval {  
  
                struct timerval it_interval;  
  
                struct timerval it_value;  
  
              };  
  
   
  
              struct timeval {  
  
                long tv_sec;  
  
                long tv_usec;  
  
              }              
  
Release     : 11/25/2006  
  
*/   
   
#include <stdio.h>    // for printf()   
  
#include <unistd.h>   // for pause()   
   
#include <signal.h>   // for signal()   
  
#include <string.h>   // for memset()   
   
#include <sys/time.h> // struct itimeral. setitimer()   
   
   
   
void printMsg(int);   
   
   
   
int main() {   
   
  // Get system call result to determine successful or failed   
   
  int res = 0;   
   
  // Register printMsg to SIGALRM   
   
  signal(SIGALRM, printMsg);   
   
     
   
  struct itimerval tick;   
   
  // Initialize struct   
   
  memset(&tick, 0, sizeof(tick));   
   
  // Timeout to run function first time   
   
  tick.it_value.tv_sec = 1;  // sec   
   
  tick.it_value.tv_usec = 0; // micro sec.   
   
  // Interval time to run function   
   
  tick.it_interval.tv_sec = 1;   
   
  tick.it_interval.tv_usec = 0;   
   
  // Set timer, ITIMER_REAL : real-time to decrease timer,   
   
  //                          send SIGALRM when timeout   
   
  res = setitimer(ITIMER_REAL, &tick, NULL);   
   
  if (res) {   
   
    printf("Set timer failed!!\n");   
   
  }   
   
   
   
  // Always sleep to catch SIGALRM signal   
   
  while(1) {   
   
    pause();   
   
  }   
   
   
   
  return 0;     
   
}   
   
   
   
void printMsg(int num) {   
   
  printf("%s","Hello World!!\n");   
   
}

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
5 [报告]
发表于 2009-08-04 15:58 |只看该作者
原帖由 piginthetree 于 2009-8-3 17:59 发表
是这样的 有一个进程要每过10分钟进行一项操作,这个用sleep可以实现使程序挂起,但是网上看到一些帖子说sleep会浪费系统资源,请问有没有别的比sleep更好的办法来实现的这个功能?秩序是在用户态运行的。

编它干嘛?用crontab.

# 分              时   日   月   星期       命令
0,10,20,30,40,50 *     *      *      *             test1
#每分钟一次
0-59/1                 *      *      *      *             test2

[ 本帖最后由 yulihua49 于 2009-8-4 16:05 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-08-04 16:04 |只看该作者

回复 #5 yulihua49 的帖子

给你转一apache里面的sleep,用select来完成的。

APR_DECLARE(void) apr_sleep(apr_interval_time_t t)
{
#ifdef OS2
    DosSleep(t/1000);
#elif defined(BEOS)
    snooze(t);
#elif defined(NETWARE)
    delay(t/1000);
#else
    struct timeval tv;
    tv.tv_usec = t % APR_USEC_PER_SEC;
    tv.tv_sec = t / APR_USEC_PER_SEC;
    select(0, NULL, NULL, NULL, &tv);
#endif
}

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
7 [报告]
发表于 2009-08-04 16:09 |只看该作者

回复 #6 shuchi91 的帖子

可以。
但无论sleep或select,都是休眠时间,而不是定时器,总周期是休眠时间+运行时间。
使用定时器需要实时操作系统。Linux不是实时的。

[ 本帖最后由 yulihua49 于 2009-8-4 16:10 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-08-04 19:08 |只看该作者
使用定时器的话一般用来回调用的,这个定时器很耗费资源,不建议使用
wellhope 该用户已被删除
9 [报告]
发表于 2009-08-10 15:24 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2009-08-10 18:01 |只看该作者
信号或者crontab。

尤其是crontab,现成的东西。而且前几天大家讨论过很多了吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP