Chinaunix首页 | 论坛 | 博客
  • 博客访问: 99303
  • 博文数量: 23
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-22 10:44
文章分类

全部博文(23)

文章存档

2018年(3)

2017年(1)

2015年(1)

2014年(18)

我的朋友

分类: 嵌入式

2014-09-29 17:57:45

网络编程中整体架构上使用 select 做定时器 和 fd 检测使用。

select做定时器和大循环的主要检测函数

select 函数作为定时器 和 系统的循环处理功能架构

  1. int main(int argc, char **argv)
  2. {
  3.  //初始化系统参数和配置

  4.   struct timeval timer_now;
  5.   while()
  6.   {
  7.     gettimeofday (&timer_now, NULL);
  8.     //一、增加保存上一次时间的函数
  9.     //二、增加判断time_now和上一次保存time的比较函数
  10.      if(time_out_flag == TRUE)
  11.      {//三、增加超时处理,即定时函数,并且更新time_wait变量
  12.         //定时处理函数,将上次第二步上比较后的超出时间计算出来。
  13.         //更新time_wait的值为TIME_OUT - 超出时间。
  14.      }
  15.      else
  16.      {
  17.          //四、增加fd变化后,但是未超时,更新time_wait的值为TIME_OUT - 超出时间。
  18.      }
  19.      num = select (FD_SETSIZE, &readfd, &writefd, &exceptfd, timer_wait);
  20.      //timer_wait 是定时设置的超时时间。

  21.       if (num == 0)
  22.         continue;

  23.       if (num < 0)
  24.       {
  25.          if (errno == EINTR)
  26.            continue;

  27.           printf ("select() error: %s", strerror (errno));
  28.       }
  29.      //五、添加fd检测到变化的处理代码。
  30.   }

  31. }

此过程只作为参照,也已经验证,定时器设置的超时时间是500ms,验证结果还是比较准确的,整体系统看起来也比较简单。
后续会增加网络编程中的触发定时器,定时器中有触发fd变化,然后在select中检测fd变化后,触发回调函数的过程。基本同次编写的内容。


阅读(1649) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~