免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: _OPEN_
打印 上一主题 下一主题

linux 同一个进程 如何定制多个定时器 [复制链接]

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
11 [报告]
发表于 2008-06-17 15:14 |只看该作者
其实可以用timer_create的
然后给付ID,不过似乎有点费劲

  1. #include <sys/time.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <signal.h>
  5. #include <string.h>

  6. void handle(int signo)
  7. {
  8.         printf("hello world\n");
  9. }

  10. void init_sigaction(void)
  11. {
  12.         struct sigaction tact;
  13.         tact.sa_handler = handle;
  14.         tact.sa_flags = 0;
  15.         sigemptyset(&tact.sa_mask);
  16.         sigaction(SIGALRM, &tact, NULL);
  17. }

  18. void init_time()
  19. {
  20.         struct itimerval value;
  21.        
  22.         value.it_value.tv_sec = 0;
  23.         value.it_value.tv_usec = 20;
  24.         value.it_interval = value.it_value;
  25.         setitimer(ITIMER_REAL, &value, NULL);
  26. }

  27. int main()
  28. {
  29.         init_sigaction();
  30.         init_time();
  31.         while ( 1 );
  32.         return 0;
  33. }
复制代码



上面是最简单的配合使用

下面是csdn里找的,但是最关键的是这个librt.a,有source的能否提供下?
感激不尽


  1. gcc   example.c   -lrt   -lpthread   
  2.    
  3.   #include   <stdio.h>   
  4.   #include   <time.h>   
  5.   #include   <signal.h>   
  6.   void   
  7.   handle   (sigval_t   v)   
  8.   {   
  9.       time_t   t;   
  10.       char   p[32];   
  11.       time   (&t);   
  12.       strftime   (p,   sizeof   (p),   "%T",   localtime   (&t));   
  13.       printf   ("%s   thread   %d,   val   =   %d,   signal   captured.\n",   p,   pthread_self   (),   
  14.                       v.sival_int);   
  15.       return;   
  16.   }   
  17.    
  18.   int   
  19.   create   (int   seconds,   int   id)   
  20.   {   
  21.       timer_t   tid;   
  22.       struct   sigevent   se;   
  23.       struct   itimerspec   ts,   ots;   
  24.       memset   (&se,   0,   sizeof   (se));   
  25.       se.sigev_notify   =   SIGEV_THREAD;   
  26.       se.sigev_notify_function   =   handle;   
  27.       se.sigev_value.sival_int   =   id;   
  28.       if   (timer_create   (CLOCK_REALTIME,   &se,   &tid)   <   0)   
  29.           {   
  30.               perror   ("timer_creat");   
  31.               return   -1;   
  32.           }   
  33.       puts   ("timer_create   successfully.");   
  34.       ts.it_value.tv_sec   =   3;   
  35.       ts.it_value.tv_nsec   =   0;   
  36.       ts.it_interval.tv_sec   =   seconds;   
  37.       ts.it_interval.tv_nsec   =   0;   
  38.       if   (timer_settime   (tid,   TIMER_ABSTIME,   &ts,   &ots)   <   0)   
  39.           {   
  40.               perror   ("timer_settime");   
  41.               return   -1;   
  42.           }   
  43.       return   0;   
  44.   }   
  45.    
  46.   int   
  47.   main   (void)   
  48.   {   
  49.       create   (3,   1);   
  50.       create   (5,   2);   
  51.       for   (;;)   
  52.           {   
  53.               sleep   (10);   
  54.           }   
  55.   }   
复制代码

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
12 [报告]
发表于 2008-06-17 17:28 |只看该作者
用链表进行操作可以吗。每一个表项中都包含定时器的相对于当前时间的超时时间,每过一个固定时间,遍历一次链表,然后将超时时间减去该间隔时间,然后检查所有表项中超时时间小于0的,然后执行相应的动作。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
13 [报告]
发表于 2008-06-17 17:44 |只看该作者
如果不用链表的话,可以考虑使用数据库。前一段我写的一个守护进程,基本上也是这样设计的。

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
14 [报告]
发表于 2008-06-17 17:49 |只看该作者
原帖由 Godbach 于 2008-6-17 17:44 发表
如果不用链表的话,可以考虑使用数据库。前一段我写的一个守护进程,基本上也是这样设计的。


这个工程会不会太大了呢?
只是想实现多timer而已

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
15 [报告]
发表于 2008-06-17 17:51 |只看该作者
呵呵,我的那个里面本身也要记录统计相关数据的,所以用了SQLite。如果只是简单的需要做多个定时器,用链表应该就可以了。

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
16 [报告]
发表于 2008-06-17 17:54 |只看该作者
代码已经给出了,如果有哥们看到过librt.a里的东西的话,给一下,谢谢啦,不知道是不是glibc里的,呵呵

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
17 [报告]
发表于 2008-06-17 18:11 |只看该作者
原帖由 T-bagwell 于 2008-6-17 17:54 发表
代码已经给出了,如果有哥们看到过librt.a里的东西的话,给一下,谢谢啦,不知道是不是glibc里的,呵呵


刚刚在glic-2.6.1里面搜了关键字librt,有结果。很有可能在glibc里。楼上的在glibc里找找吧。

论坛徽章:
0
18 [报告]
发表于 2008-06-18 08:39 |只看该作者
原帖由 Godbach 于 2008-6-17 17:28 发表
用链表进行操作可以吗。每一个表项中都包含定时器的相对于当前时间的超时时间,每过一个固定时间,遍历一次链表,然后将超时时间减去该间隔时间,然后检查所有表项中超时时间小于0的,然后执行相应的动作。


开源

论坛徽章:
0
19 [报告]
发表于 2008-06-18 16:02 |只看该作者

需要定时器来中断吗?

如果不用中断可以用time或者times来实现秒级的定时。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP