注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

muduo库的一些心得之一定时器之自定义测试  

2014-06-03 20:22:07|  分类: LINUX编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

muduo库的一些心得之一定时器之自定义测试

 

看了上面的方法,就想重新自定义一个简单一些的,然后在这个简单的基础上再不断的扩展出去,以达到学以致用的目的。

首先创建一个阻塞的定时器:这段代码是从网上找的:

http://www.myexception.cn/linux-unix/1615814.html

#include <sys/timerfd.h>

#include <sys/time.h>

#include <time.h>

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <stdint.h>        /* Definition of uint64_t */

 

#define handle_error(msg) \

            do { perror(msg); exit(EXIT_FAILURE); } while (0)

 

void printTime()

         struct timeval tv; 

         gettimeofday(&tv, NULL); 

         printf("printTime:  current time:%ld.%ld ", tv.tv_sec, tv.tv_usec);

}

 

int main(int argc, char *argv[])

{

   struct timespec now;

   if (clock_gettime(CLOCK_REALTIME, &now) == -1)

            handle_error("clock_gettime");

 

   struct itimerspec new_value;

   new_value.it_value.tv_sec = now.tv_sec + atoi(argv[1]);

   new_value.it_value.tv_nsec = now.tv_nsec;

   new_value.it_interval.tv_sec = atoi(argv[2]);//带参数的地方可以在测试时写成定值

   new_value.it_interval.tv_nsec = 0;

 

   int fd = timerfd_create(CLOCK_REALTIME, 0);

   if (fd == -1)

            handle_error("timerfd_create");

 

   if (timerfd_settime(fd, TFD_TIMER_ABSTIME, &new_value, NULL) == -1)

            handle_error("timerfd_settime");

 

   printTime();

   printf("timer started\n");

  

   for (uint64_t tot_exp = 0; tot_exp < atoi(argv[3]);)

   {

       uint64_t exp;

            ssize_t s = read(fd, &exp, sizeof(uint64_t));

            if (s != sizeof(uint64_t))

                      handle_error("read");

 

            tot_exp += exp;

            printTime();

            printf("read: %llu; total=%llu\n",exp, tot_exp);

   }

 

   exit(EXIT_SUCCESS);

}

然后程序很正常的开始动作起来。然后想改成和muduo中一样的回调异步方式,第一次只是简单把创建时的参数给改了:

Int fd =

timerfd_create(/*CLOCK_REALTIME*/CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC);

然后增加:

 struct pollfd myp;

 myp.fd = fd;

 myp.events = POLLIN | POLLPRI;

 myp.revents = 0;

int numevent =   ::poll(&myp,sizeof(myp),20000);

程序没有任何作用。查找了半天资料,后来才慢慢发现,是不是思路出了错误,一直只是把::read给理解成了阻塞情况下的使用方法,直到后来明白他只是为了清理LT触发,与阻塞的作用是完全不同的,这也怪资料上对在非阻塞情况下read的解释太过模糊和简单了。

后来想明白了:

#include <sys/timerfd.h>

#include <sys/time.h>

#include <time.h>

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <stdint.h>        /* Definition of uint64_t */

#include <poll.h>

#include <string.h>

 

#define handle_error(msg) \

           do { perror(msg); exit(EXIT_FAILURE); } while (0)

 

void printTime()

{

        struct timeval tv;

        gettimeofday(&tv, NULL);

        printf("printTime:  current time:%ld.%ld ", tv.tv_sec, tv.tv_usec);

}

 

int main(int argc, char *argv[])

{

  //下面加黑部分其实在这种情况下就没有什么作用了

   struct timespec now;

   if (clock_gettime(CLOCK_REALTIME, &now) == -1)

           handle_error("clock_gettime");

 

   struct itimerspec new_value;

   new_value.it_value.tv_sec = now.tv_sec + 1; //atoi(argv[1]);

   new_value.it_value.tv_nsec = now.tv_nsec;

   new_value.it_interval.tv_sec = 1;//atoi(argv[2]);

   new_value.it_interval.tv_nsec = 0;

 

   struct itimerspec howlog;

   bzero(&howlog,sizeof howlog);

   howlog.it_value.tv_sec = 5;

//注意一个容易犯错的地方:tv_nsec加上去后一定要判断是否超出1000000000(如果超过//要秒加一),否则会设置失败。

   int fd =

timerfd_create(/*CLOCK_REALTIME*/CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC);

   if (fd == -1)

           handle_error("timerfd_create");

 

   if (timerfd_settime(fd, /*TFD_TIMER_ABSTIME*/0, &howlog, NULL) == -1)

           handle_error("timerfd_settime");

 

   printTime();

   printf("timer started\n");

 

   struct pollfd myp;

                                                                                                                                      myp.fd = fd;

   myp.events = POLLIN | POLLPRI;

   myp.revents = 0;

 

  int numevent =   ::poll(&myp,sizeof(myp),20000);

  int tnum = ::poll(&myp,sizeof myp,20000);

 

   for (uint64_t tot_exp = 0; tot_exp </* atoi(argv[3])*/4;)

   {

       uint64_t exp;

           ssize_t s = read(fd, &exp, sizeof(uint64_t));

           if (s != sizeof(uint64_t))

                   handle_error("read");

 

           tot_exp += exp;

           printTime();

           printf("read: %llu; total=%llu\n",exp, tot_exp);

   }

 

   exit(EXIT_SUCCESS);

}

                                                                                                                                      

再编译断点测试,发现就没有什么问题了。两次poll的目的就是为了测试read做与不做,是不是会在LT触发的情况下不断的触发超时事件。

时间的文件句柄就先写到这里。有时间继续。

  评论这张
 
阅读(514)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017