小言_互联网的博客

Linux(服务器编程):29---定时机制之I/O复用系统调用的超时参数

388人阅读  评论(0)

一、I/O复用系统调用的超时参数

  • Linux下的3组I/O复用系统调用都带有超时参数,因此它们不仅能统一处理信号和I/O事件,也能统一处理定时事件。
  • 但是由于I/O复用系统调用可能在超时时间到期之前就返回(有I/O事件发生),所以如果要利用它们来定时,就需要不断更新定时参数以反映剩余的时间

二、代码演示案例


  
  1. #define TIMEOUT 5000
  2. int main()
  3. {
  4. int timeout=TIMEOUT;
  5. time_t start=time( NULL);
  6. time_t end=time( NULL);
  7. while( 1)
  8. {
  9. printf( "the timeout is now %d mil-seconds\n",timeout);
  10. start=time( NULL);
  11. int epoll_ret_value=epoll_wait(epollfd,events,MAX_EVENT_NUM,timeout);
  12. //epoll_wait函数出错
  13. if((epoll_ret_value< 0)&&(errno!=EINTR)){
  14. printf( "epoll failure");
  15. break;
  16. }
  17. /*如果epoll_wait返回0,说明超时时间到了,
  18. 那么便可处理定时任务,并重置定时时间*/
  19. if(epoll_ret_value== 0){
  20. timeout=TIMEOUT;
  21. continue;
  22. }
  23. end=time( NULL);
  24. /*如果epoll_wait的返回值大于0,则本次epoll_wait调用持续
  25. 的时间是(end-start)*1000ms,我们需要将定时时间timeout减
  26. 去这段时间,以获得下次epoll_wait调用的超时参数*/
  27. timeout-=(end-start)* 1000;
  28. /*重新计算之后的timeout值有可能等于0,说明本次epoll_wait调用返回时,
  29. 不仅有文件描述符就绪,而且其超时时间也刚刚好,
  30. 此时我们也要处理定时任务,并重置定时时间*/
  31. if(timeout<= 0)
  32. timeout=TIMEOUT;
  33. }
  34. }

 


转载:https://blog.csdn.net/qq_41453285/article/details/103719077
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场